在.NET 4.0中加载本地DLL时出现BadImageFormatException异常

4

我正在尝试通过USB使用一个带有原生DLL的CAN设备,该DLL需要被.NET C#类包装(由供应商提供源代码),并包含在用户项目中。他们的示例应用程序针对.NET 2.0,而我的应用程序针对.NET 4.0。我能够在他们的示例应用程序中使用代码并成功进行调试,但是当我尝试调试我的应用程序时,就会出现BadImageFormatException错误:

System.TypeInitializationException: The type initializer for 'TotalPhase.KomodoApi' threw an exception. ---> System.BadImageFormatException: An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

他们的代码和我的唯一区别似乎是,他们的代码是建立在.NET 2.0上的应用程序,而(目前)我的代码正在.NET 4.0中作为MSTest单元测试运行。两种解决方案都针对AnyCPU。我正在运行Windows 7 Ultimate 64位安装。即使从AnyCPU更改为x86也没有任何区别。如何使这个本地DLL在AnyCPU项目中加载?


你尝试过将他们的应用程序重新定位到 .Net 4.0 吗?你能展示一下你是如何与本地 DLL 进行交互的吗? - vossad01
1
本机 dll 编译的目标平台是什么?x64 还是 x32?您可以使用 depends 查找。或者 DumpBin/Headers xxx.dll。 - Alois Kraus
感谢DumpBin建议,这很有帮助。我错误地从他们的SDK中选择了错误的DLL。我复制了64位DLL,但本意是使用32位DLL。这个程序需要在32位客户端上运行。 - Alex Marshall
1个回答

10
如果在与本地DLL交互时遇到 BadImageFormatException ,几乎总是意味着您正在尝试在64位CLR中与32位DLL进行接口交互,反之亦然。
当运行示例应用程序时,进程在任务管理器的“进程”选项卡的“映像名称”列中是否具有* 32? 这表示应用程序正在以32位CLR中运行。 检查您自己的应用程序。 可能性是在您测试的计算机上只有32位.NET 2.0运行时,但同时存在32位和64位.NET 4.0运行时,或者反过来。
如果您正在使用.NET应用程序分发本机DLL,则应将启动项目设置为x86或x64(而不是AnyCPU),具体取决于本机库是32位还是64位。 您始终可以提供32位和64位版本,并根据客户端架构让安装程序选择安装哪些二进制文件。
或者,您可以使用具有不同文件名的32位和64位DLL进行分发,为每个版本定义单独的P / Invoke stub,并在运行时决定调用哪一个。这种方法最简单的方法可能是在接口(例如INativeMethods)中包装本机调用,并根据IntPtr.Size在运行时选择要实例化的实现方式。通过此方法,您仍然可以针对AnyCPU。

为什么使用系统dll时不会发生这种情况?例如,我可以使用任何CPU轻松导入系统函数,如PrintWindow。 - victor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接