未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

本文原地址 https://www.cnblogs.com/sundajade/articles/3735663.html

     最近想做一个用C#控制USB Realy,其中usb_relay_device.dll是用C所写的dll,网上有很多C++调用的例子,也有很多用C#调用usb_relay_device.dll的调用方法,但是在自己实际使用时,一直提示

"未处理System.BadImageFormatException
  HResult=-2147024885
  Message=试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)",

如下图所示。

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第1张图片

在网上找了很多资料,终于找到了解决方法。详细文件见上文地址。自己本地遇到的状况是,本机是64位系统,但是usb_relay_device.dll是32位系统dell,将生成的目标平台更改成x86即可。

-------------------------分割线-----------------------------------------

两种原因:

第一种为程序的运行以平台系统位数不匹配,第二种则是该死的VS整出来的...

一般在下面三种情景下会发生.

1.64位系统上C#调用32位的C++ *.dll

2.64位系统上IIS发布含有32位的 *.dll应用程序时

3.64位系统上编写C++ *.dll,在64位系统上通过 C#调用 ,可能成功,也可能失败,失败就报BadImageFormatException 异常,也是最二的一种情况.是由该死的VS整出来的

 

解决方法如下:

1.VS在64位系统下面,编译调试某个C++的API的时候,报错:未处理BadImageFormatException 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)

详见下图:

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第2张图片

 其原因是该API是在32位系统下面开发的,在64位系统上面开发编译的时候需要将生成的目标平台设为X86。

方法是:

    在右边的“解决方案资源管理器”里,右键该项目点击属性。在属性窗口里选择“生成”——“目标平台”下拉里选中“X86"即可。见下图:

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第3张图片

2.在64位操作系统下IIS发布32位的项目,报“项目依赖的dll无法读取,试图加载格式不正确的程序”错误。 

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第4张图片

原因:程序集之间的通讯要么全是64位环境下的,要么全是32位环境下的。不能混编访问。不然会出现“试图加载格式不正确的程序”的错误;

解决办法是把发布网站的程序池开通32位兼容性即可,如下图:

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第5张图片

 

3.如果上面的没有解决,那就是VS中C#工程的问题,打开对应的工程文件(*.csproj),如下图false节点

未处理System.BadImageFormatException,试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)_第6张图片

下面是MSDN的解释:

CSharpProjectConfigurationProperties6.Prefer32Bit 属性

获取或设置一个标志,指示是否首选的 32 位平台。

命名空间:  VSLangProj110

程序集:  VSLangProj110(在 VSLangProj110.dll 中)

语法

C#

bool Prefer32Bit { get; set; }

属性值

类型:System.Boolean

返回表示 32 位首选项的标志。 返回true如果 32 位是首选。 否则,返回false。 

 

来自 

我们要做的修改就是将Prefer32Bit节点删除掉或是把节点的值改为true,保存,重新打开或是加载VS中的工程,再运行,OK

你可能感兴趣的:(C#,C#,usb,hid,usb,relay)