Any CPU question 1和Any CPU Question 2
我有一个应用程序,最初是使用Visual Studio 2005建立在Win XP(不要笑!).这个应用程序调用我们的win32 C DLL.调用C DLL的C#组件是使用“任意CPU”配置构建的,并且已经高兴地在Win XP上工作,没有任何问题.
我们现在正在移动到Win 7,并且我们的应用程序的发布版本(建立在Win XP与VC 2005)工作正常.然而,随着对我们的用户的推出,我们现在已经把这个opoutunity转移到了VS 2010,并且已经在VC 2010中构建了win7的C#组件,但是当运行这个版本时,我得到了很多“无法加载abc. dll“其中abc.dll是我们的win32 c组件.
我明白,用x86配置重新编译C#程序集将会解决问题,但我不明白的是,如何使用Win-XP / Visual studio 2005(任何CPU配置)构建的版本c#程序集都可以在Win 7上运行,而无需任何问题?当然这些使用“任何CPU”构建的C#程序集应该在Win 7中加载时将JIT转换为64位代码,并导致BadImageFormatException或其他错误,因为它们调用Win32 C DLL.
更新:我有更多的信息请求在下面的评论.
>在我的Windows 7盒子上,我右键单击我的电脑,看看属性.系统信息说“系统类型:64位操作系统”确认这是一个Win64操作系统.
>在Windows XP上打开VC2005中的解决方案查看解决方案的配置管理器时,我可以确认所有C#项目是平台类型“任何CPU”.
>在64位Win 7机器上运行发布版本(在VC2005 / win xp上完成)时,我的任务管理器将映像名称显示为“Test.exe * 32”,这样可以确认它是jit’d并加载到32位进程.
解决方法
并且这个托管代码EXE调用到32位DLL的事实从get-go – P / Invoke以及COM互操作,通过后期绑定工作是不明显的.因此,EXE被加载,加载程序不检查依赖关系 – 一方面,依赖关系可能是有条件的 – 然后DLL加载时间到来,随之而来.
那么是的,如果您使用已知的32位依赖关系管理代码,那么最好在编译时指定一个32位的CPU.或者将C部分重新编译为64位,这也是一个选择.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。