【发布时间】:2022-01-01 08:48:00
【问题描述】:
我正在尝试在 Visual Studio Community 2022 中创建的控制台应用程序项目中加载第三方 DLL。环境是 Windows 10。我已尝试过 .NET 5.0 和 6.0
无论我尝试了什么,我都会收到错误“未处理的异常。System.BadImageFormatException: 错误的 IL 格式。文件的格式无效。”
我已经检查过了,通常这个错误是因为我试图在 x86 应用程序中加载 x64 DLL,反之亦然,但我知道情况并非如此,因为:
- 我已经能够在 C(使用 Codeblocks 中的 LoadLibrary())和 JAVA(使用 JNA)中加载这个特定的 DLL,为 x86 目标平台配置应用程序。我已经为 x86 目标平台以及属性配置了这个控制台应用程序。
- 加载后的 DLL 开始写入日志文件。日志文件目的地是固定的,不能被停用。每当我运行我的应用程序时,我都会看到正在写入的日志。我意识到正在使用 Sysinternals 的进程监视器写入日志。
日志只说
信息:2.23.00 12:14:27(00000015) PCLService.cpp:138 [22.11.2021] 日志创建
INFO: 2.23.00 12:14:27(00000000) PCLService.cpp:141 PDA_Manager: DllMain 附加
INFO: 2.23.00 12:14:27(00000000) PCLService.cpp:145 PDA_Manager: DllMain 分离
通常,分离应该只在 DLL 被卸载/程序关闭时发生。在这里它会自动发生。就像程序无法保持DLL加载一样,给出错误消息。
这是我当前的代码。
using System;
using System.Reflection;
namespace ConsoleApp5
{
internal class Program
{
static void Main(string[] args)
{
//var DLL = Assembly.LoadFile(@"C:\Documentacion\VisaNet\Proyectos\Simpler\bin\Debug\x86\PCLService.dll");
var DLL = Assembly.LoadFrom("PCLService.dll");
Console.ReadLine();
}
}
}
我已经尝试过 LoadFrom() 和 LoadFile()。甚至尝试过Load(),但错误是关于我不知道如何获取的附加信息。
我检查了程序集绑定日志查看器 (fuslogvw.exe) 和进程监视器。我没有发现任何明显的问题。
我假设无论发生什么错误,它确实发生在关于 PCLService.log 的最后 4 个条目的时间,这必须是那些在 DLL 日志中写入关于分离的条目,因为在 Process Monitor 中没有更多关于日志的条目.
虽然我是一名经验丰富的程序员,但我对 Visual Studio / C# 完全陌生
欢迎任何帮助。
【问题讨论】:
-
Assembly.LoadFrom() 只能用于加载 .NET 程序集。 “PCLService.cpp”给出了一个非常强烈的提示,即这个 DLL 不是这样的程序集,C++ 通常会生成一个只能在 C# 中使用 [DllImport] 的本地 DLL。对于这样的 DLL,你会得到 BadImageFormatException。
-
无论出于何种原因,每当我搜索“在 C# 中加载 DLL”时,我都会得到关于程序集的结果。正如我所说,我是 C# 的新手,所以虽然我认为它不一样,但我没有看到替代方案。
标签: c# dll c#-5.0 visual-studio-2022