这个问题涉及上一个关于SO的问题
Any CPU question 1和Any CPU Question 2
我有一个应用程序,它最初是使用Visual Studio 2005在Win XP上构建的(不要笑!)。这个应用程序调用我们的win32 C ++ DLL。调用C ++ dll的C#组件是使用“Any CPU”配置构建的,并且很乐意在Win XP上运行,没有任何问题。
我们现在转向Win 7,我们的应用程序的发布版本(使用VC 2005构建在Win XP上)运行良好。然而,随着win 7向我们的用户推出,我们现在已经采取了机会转向VS 2010,并且我已经使用VC 2010在win 7上构建了C#组件,但现在运行此版本时,我得到很多“无法加载abc。 dll“其中abc.dll是我们的win32 c ++组件。
据我所知,使用x86 config重新编译C#程序集将解决问题,但我不明白的是,如何使用Win-XP / Visual studio 2005(任何CPU配置)构建的发行版c#程序集能够运行赢7没有任何问题?当然,这些使用“任何CPU”构建的C#程序集在Win 7中加载时应该JIT到64位代码并导致BadImageFormatException或其他错误,因为它们调用Win32 C ++ dll。
更新:我在下面的评论中提供了更多信息。
在我的Windows 7框中,我右键单击我的计算机并查看属性。系统信息显示“系统类型:64位操作系统”,确认这是Win64操作系统。
在Windows XP上的VC2005中打开解决方案在查看解决方案的配置管理器时,我可以确认 ALL C#项目是平台类型“任何CPU”。
< / LI>在64位Win 7机器上运行发布版本(在VC2005 / win xp上完成)时,我的任务管理器将图像名称显示为“Test.exe * 32”,这确认它是jit'd并加载到32位进程。
答案 0 :(得分:4)
在Win7下,进程为64位。 64位进程中不能包含32位DLL,这是Windows的一个非常基本的设计限制。
这个托管代码EXE调用一个32位DLL的事实并不明显,从一开始--P / Invoke以及COM互操作,通过后期绑定工作。因此加载EXE,加载器不检查依赖关系 - 首先,依赖关系可能是有条件的 - 然后DLL加载时间到来,随之而来的是wackiness。
所以,是的,如果您拥有已知32位依赖关系的托管代码,则最好在编译时指定32位CPU。或者将C ++部分重新编译为64位,这也是一种选择。
答案 1 :(得分:2)
我可以确认你应该得到BadImageFormatException。有可能XP上的编译很糟糕,它实际上并没有构建AnyCPU,而是构建标记为AnyCPU的x86。我还可以确认,可能会错误地使用项目文件,并且项目升级组件会对此产生影响。
答案 2 :(得分:1)
一个可能的解释是,32位开发系统解决方案中的一个项目有一个32位程序集的二进制引用,这将迫使它作为32位进程加载,即使在64-比特系统。