我有一个DLL(FreeType),肯定是32位(标题:IMAGE_FILE_MACHINE_I386)。
我想使用DllImport从C#代码中使用它。
我的应用程序的目标是x86,IntPtr.Size是4,进程是32位。
但是我得到BadImageFormatException(HRESULT的异常:0x8007000B)。有什么不对?
当然我使用的是64位Windows 7。
答案 0 :(得分:41)
据我所知,专门为x86构建并在64位操作系统中运行的程序集只能加载为x86构建的库,否则将抛出BadImageFormatException。在64位操作系统中,为Any CPU或x64构建的程序集在尝试加载x86库时会抛出相同的异常。
因此,假设没有什么令人难以置信的奇怪的事情,我会确保您通过打开项目属性并单击Build选项卡将应用程序设置为x86。确保'Platform Target'设置为'x86'而不是任何CPU。
或者,您可以尝试查找64位版本的DLL以进行测试。
答案 1 :(得分:7)
使用Build中的“Any CPU”选项重新编译dll - >平台。
答案 2 :(得分:6)
答案 3 :(得分:4)
此外,对于Web应用程序需要解析在IIS 7中运行32位应用程序。请参阅http://www.fishofprey.com/2009/04/badimageformatexception-in-iis-70-on-64.html
答案 4 :(得分:4)
从C#调用64位C Dll时出现相同的错误。我必须手动将C#Properties->Build->Platform target
从Any Cpu
更改为x64
。显然Any Cpu
有时候是NoCpu。
答案 5 :(得分:2)
我有类似的错误。 我可以通过添加ucrtbase.dll或ucrtbased.dll进行调试以及将vcruntime140.dll或vcruntime140d.dll添加到可执行文件的目录中来解决此问题。 我认为140取决于您正在使用的Visual Studio的版本号。
ucrtbase.dll通常位于C:\Windows\System32
。
vcruntime140.dll位于C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x86\vcruntime140.dll
您可以在此处找到更多信息:http://blogs.msdn.com/b/vcblog/archive/2015/03/03/introducing-the-universal-crt.aspx
答案 6 :(得分:2)
我怀疑这个例外的常见原因在问题首次提出后的8年内发生了变化。在我使用VS 2017的设置中,我发现取消选中"首选32位"解决了这个问题:
Uncheck "Prefer 32-bit" in the Build options
这使我从C ++构建的64位DLL正确加载。相反,选中此选项应该可以正确加载32位DLL。
答案 7 :(得分:1)
当您使用Visual Studio构建本机应用程序/ DLL时,它会依赖于"可再发行的"该版本的Visual Studio的包。它包含msvcr100.dll
和msvcp100.dll
等DLL(对于100的各种值)。
在我的情况下,我在目标机器的Windows/system32
目录中看到了这些DLL,所以我觉得一切都很顺利。事实证明那些DLL是x64!我不知道为什么名为system32
的目录包含64位DLL。因此,我在Visual Studio 2010目录中搜索了名为msvc*.dll
的所有内容,并找到了msvcr100.dll
和msvcp100.dll
的x86版本。我把它们复制到目标机器上(在我的程序路径可以访问的地方),一切都很顺利。
我希望这有助于其他人面对微软的疯狂。
答案 8 :(得分:1)
您在C#项目中使用“属性”,然后将“平台目标”更改为x64。 enter image description here
答案 9 :(得分:0)
您可以尝试选中“属性”选项 - > “构建” - > “允许不安全的代码”。
答案 10 :(得分:-1)
我在MS Visual C#Express 2010中有相同的异常。我使用Dependency Walker和MiTeC EXE Explorer检查了所有构建.dll和.exe文件,所有内容都是为32位构建的!
最后,我的.csproj文件中缺少以下行:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'MY_CONFIG|x86'">
...
<PlatformTarget>x86</PlatformTarget>
...
</PropertyGroup>
我不知道它为什么会丢失......我猜MS Visual C#Express 2010并非无错误;)