我现在有一个为.NET 2.0编写的C#应用程序,目标是 AnyCPU 。它目前引用了一些我没有源代码的第三方.NET DLL(我不确定它们是否是为x86,x64或AnyCPU构建的)。
如果我想在64位Windows操作系统上专门运行我的应用程序,我应该定位哪个平台才能使我的应用程序正常运行?我目前的理解是目标:
另外,我是否相信,在构建引用第三方x86 .NET DLL的应用程序时,定位AnyCPU时不会产生任何错误,当应用程序在64位运行时尝试加载这些DLL时,它将引发运行时异常。位OS。
因此,只要我的第三方DLL之一正在进行p / Invoke或者是x86,我只能针对此应用程序定位x86吗?
答案 0 :(得分:7)
你可以从AnyCPU DLL进行P / Invoke,你只需要更加小心P / Invoke定义(即你不会无意中假设32位或其他东西)。问题是很难知道第三方DLL是否在没有Reflector的情况下做正确的事情并将其拆解(除非开发人员特别声明64位支持)。
但除此之外,你几乎都是现场的。
老实说,对于99%的应用程序,目标x86是完全可以接受的。实际受益于64位的应用程序数量相对较少。 (性能问题通常只是一个问题:更多的寄存器被x86模式的寄存器重命名和更大的数据结构所抵消,因为指针是两倍大[并且在像.NET这样的参考重系统中甚至更糟])
答案 1 :(得分:7)
我对你问题的这个特定部分感到好奇。
另外,我是否有理由相信 目标AnyCPU将生成否 构建应用程序时出错 引用第三方x86 .NET DLL, 应用程序将抛出运行时 尝试加载这些时的异常 DLL在64位操作系统上运行时。
所以我试了一下。我创建了一个针对x86的DLL项目ClassLibrary1
,然后添加了一个针对AnyCPU的ConsoleApplication1
并引用了另一个项目。我确保在Main方法中实际使用ClassLibrary1项目中的类。
Visual Studio没有给我任何关于引用或构建应用程序的警告或投诉。当我运行应用程序(在64位操作系统上)并且加载了ClassLibrary1程序集时,我遇到了BadImageFormatException。
如果我将ConsoleApplication1更改为目标x64,我会收到编译器警告但编译成功并且在运行时发生相同的异常。
所以回答你的问题,是的,如果你的引用程序集(或者在运行时加载的任何程序集)也没有为AnyCPU编译,你很可能会遇到麻烦。如果您不确定,并且您不需要额外的地址空间,我会坚持使用x86。如果您确定您的依赖项是针对AnyCPU编译的,那么您可以根据需要定位AnyCPU,但一定要在两种处理器架构中进行大量测试。