问题 尝试使用VS安装加载带有错误格式异常的程序


我设计了一个C#Windows appln,它也在内部调用一些函数[通过DllImport()从C ++ DLL导入]

我的C ++代码在Win32平台中构建为.DLL,而我的C#构建为“任何CPU”平台。

当我在我的测试机器中运行.EXE(C#)时,我面临一个错误

尝试加载格式不正确的程序   来自hresult 0x8007000B的异常

但是,如果我在我的机器中安装VSS 2010然后运行EXE,则不会遇到此错误。

1)出现此错误的原因? 2)安装VSS时为什么没有观察到错误? 

我已经使用Win7 OS(64位)来构建.EXE(C#) AnyCPU 平台又依赖于内置的DLL(使用DllImport在C#中导入的C ++ Dll) Win32的


3870
2017-09-18 18:38


起源

我猜这是一个比特不匹配的错误 - 你的.dll是32位而你的.exe是64位或者相反。 VS安装了大量的东西,虽然我不知道这究竟是如何解决你的问题。 - dandan78
任何人都可以帮助吗? - stack_pointer is EXTINCT
请更新您的问题以包括操作系统,.dll位和.exe位。另外,检查您的构建设置并强制.Net部分匹配.dll的位数。 - dandan78
我已经检查了所有设置,并在上面进行了更新。请知道: - stack_pointer is EXTINCT
你正在运行它的机器怎么样?请注意,Win32只是低级Windows API的名称,并且没有Win64,尽管Win32应用程序可以编译为64位.exe。 - dandan78


答案:


这几乎总是因为你从64位dll / exe等调用32位代码或从32位dll调用64位dll。如果为x86构建c#会发生什么?它仍将在64位上运行。


10
2017-09-18 19:49



我还在想,因为我在平台上选择了Win32时,测试机器是32位,以及C ++ dll是如何生成64位的。当我使用x86(而不是任何CPU)时,这个问题就解决了。这里有什么问题? - stack_pointer is EXTINCT
任何CPU意味着框架将确定在应用程序启动时是以64位还是32位运行。我原本期望测试机器是64,因此无法在运行时调用32位c ++ dll。 - Rob A
Dll构建为Win32,EXE构建为安装VS的x86bit机器上的任何CPU平台(在VSS中)。现在,测试机具有运行此应用程序的x86版操作系统。从那里开始,64位正在投入,因为一切都是x86。 - stack_pointer is EXTINCT
或者从32位代码调用64位dll - littlecodefarmer758