2010-06-01 49 views
10

我有一个针对.NET 2.0编写的现有C#应用程序,目标是AnyCPU。它目前引用了一些第三方.NET DLL,我没有它的源代码(我不确定它们是否为x86,x64或AnyCPU构建)。在构建64位窗口时针对x86与AnyCPU操作系统

如果我想在64位Windows操作系统上专门运行我的应用程序,那么我应该定位哪个平台以使我的应用程序无错地运行?我当时的理解是目标:

  • :如果至少有一个第三方的.NET的DLL是专为x86或使用P/Invoke来的Win32 DLL的接口。应用程序将在32位和64位操作系统上以32位模式运行。
  • x64:如果所有第三方.NET dll已经为x64或AnyCPU构建。应用程序只能在64位操作系统中运行。
  • AnyCPU:如果所有第三方.NET dll已经为AnyCPU构建。应用程序将在32位操作系统上以32位模式运行,在64位操作系统上以64位运行。

而且,我是有权认为,虽然针对AnyCPU将产生没有错误构建应用程序中引用第三方的x86 .NET的DLL时,应用程序将引发运行时异常时,它会尝试在运行时加载这些DLL在64位操作系统上。

因此,只要我的第三方DLL中的一个正在执行p/Invoke或x86,我只能针对此应用程序的x86目标?

回答

7

你可以从AnyCPU DLL中进行P/Invoke,只需要对P/Invoke定义(即你不会无意中假设32位或某物)有点小心。问题在于,很难知道第三方DLL是否在没有Reflector的情况下做正确的事情并对其进行反汇编(除非开发人员明确指出64位支持)。

但除此之外,你几乎可以找到。

说实话,对于99%的应用程序来说,瞄准x86是完全可以接受的。这是相对较少的实际上受益于64位的应用程序。 (性能问题通常只是一点点洗涤:更多的寄存器被x86模式和更大的数据结构的寄存器重命名所抵消,因为指针是两倍大[并且在像.NET这样的参考系统中甚至更糟])

7

我很好奇你的问题的这个特定部分。

而且,我说的对相信,在建设 引用第三方的x86 .NET的DLL一个应用程序时 打靶AnyCPU将不产生 错误, 应用程序将引发运行时异常 当它试图加载这些 DLL在64位操作系统上运行时。

所以我试了一下。我创建了一个针对x86的DLL项目ClassLibrary1,然后添加了一个针对AnyCPU的ConsoleApplication1并引用了另一个项目。我确保实际使用Main方法中的ClassLibrary1项目中的类。

Visual Studio不给我任何有关引用或构建应用程序的警告或投诉。当我运行应用程序(在64位操作系统上)并且加载了ClassLibrary1程序集时,我遇到了一个BadImageFormatException异常。

如果我将ConsoleApplication1更改为目标x64,则会收到编译器警告,但编译成功并且运行时发生相同的异常。

所以要回答你的问题,是的,如果你引用的程序集(或者在运行时加载的任何程序集)没有为AnyCPU编译,你也可能会遇到麻烦。如果你不确定,并且你不需要额外的地址空间,我会坚持瞄准x86。如果你确定你的依赖关系是为AnyCPU编译的,那么你可以定位AnyCPU,但是一定要在两个处理器体系结构中进行大量的测试。

+0

AnyCPU是我的VS实例的默认目标平台,当你除了.NET框架之外没有其他的依赖关系时,这是毫无疑问的。一旦引入了其他依赖关系,则假定应用程序将继续在64位平台上工作,仅仅是因为应用程序针对AnyCPU并编译没有问题,这将是一件痛苦的事情。谢谢回答 :) – anonymous 2010-06-01 05:37:49

相关问题