Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET 4.0中加载本机DLL时发生BadImageFormatException_C#_.net_Dllimport - Fatal编程技术网

C# 在.NET 4.0中加载本机DLL时发生BadImageFormatException

C# 在.NET 4.0中加载本机DLL时发生BadImageFormatException,c#,.net,dllimport,C#,.net,Dllimport,我正在尝试使用USB上的CAN设备,该设备带有一个本机DLL,需要由一个包含在项目中的.NET C#类(供应商提供的源代码)包装。他们的示例应用程序以.NET2.0为目标,而我的应用程序以.NET4.0为目标。我能够在他们的示例应用程序中使用这些代码,并且调试一切正常,但是,当我尝试调试我的应用程序时,我遇到了一个BadImageFormatException: System.TypeInitializationException: The type initializer for 'Total

我正在尝试使用USB上的CAN设备,该设备带有一个本机DLL,需要由一个包含在项目中的.NET C#类(供应商提供的源代码)包装。他们的示例应用程序以.NET2.0为目标,而我的应用程序以.NET4.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单元测试运行的。这两种解决方案都以任何CPU为目标。我正在Windows 7 Ultimate 64位安装上运行。即使从AnyCPU更改为x86也没有任何区别。如何将此本机DLL加载到AnyCPU项目中?

如果与本机DLL接口时出现
BadImageFormatException
,则几乎总是意味着在64位CLR中运行时尝试与32位DLL接口,反之亦然

运行示例应用程序时,进程是否在任务管理器的“进程”选项卡的“映像名称”列中有
*32
?表示应用程序正在32位CLR中运行。同时检查您自己的应用程序。您正在测试的机器可能只有32位的.NET 2.0运行时,但同时有32位和64位的.NET 4.0运行时,或者相反

如果在.NET应用程序中分发本机DLL,则应根据本机库是32位还是64位,将启动项目设置为目标x86或x64(与任何CPU相对)。您始终可以提供32位和64位版本,并让安装程序根据客户机体系结构选择要安装的二进制文件


或者,您可以同时提供具有不同文件名的32位和64位DLL,为每个版本定义单独的p/Invoke存根,并决定在运行时调用哪一个。实现这一点最简单的方法可能是将本机调用封装在接口中(例如,
INativeMethods
),并根据
IntPtr.Size
选择在运行时实例化哪个实现。使用此方法,您仍然可以将任何CPU作为目标。

您是否尝试将其应用程序重新定位到.Net 4.0?您能说明如何与本机DLL交互吗?本机DLL编译的目标平台是什么?x64还是x32?你可以用depends来找出答案。或者DumpBin/Headers xxx.dll+1作为DumpBin建议,这会有所帮助。我错误地从他们的SDK中选择了错误的DLL。当我打算使用32位DLL时,我复制了64位DLL。此程序需要在32位客户端上运行。为什么在使用系统DLL时不会发生这种情况?例如,我可以导入系统功能,比如PrintWindow,只需使用任何CPU即可。