在x64和x86环境中使用PresentationCore和WindowsBase dll

时间:2011-12-06 22:32:58

标签: asp.net .net dll msbuild 32bit-64bit

PresentationCore.dll和WindowsBase.dll都包含在Microsoft .NET Framework 3.0中,每个dll的两个版本都安装到磁盘上:

  • C:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.0
  • 下的x64版本
  • C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework \ v3.0
  • 下的x86版本

在添加对这些dll的引用之前,我们的ASP.NET Web应用程序能够针对“任何CPU”进行编译,并且可以在32位或64位模式下运行而没有任何问题。通过标准的“添加引用”对话框(添加引用 - > .NET - > PresentationCore)向PresentationCore添加引用后,Web应用程序在64位模式下失败,并出现以下错误:

  

无法加载文件或程序集“PresentationCore”或其依赖项之一。试图加载格式不正确的程序。

显然这是因为64位应用程序池正在尝试加载32位版本的PresentationCore dll而失败。

现在,我对此感到有点困惑......

  1. 其他.NET Framework dll似乎无缝地在x64和x86版本之间切换(分别从Microsoft.NET/Framework64或Microsoft.NET/Framework加载)。为什么PresentationCore和WindowsBase有什么不同?
  2. 为什么Visual Studio似乎只在“添加引用”对话框的“.NET”选项卡下提供32位版本?如果我想要64位版本,我必须“浏览”它。
  3. 是否有任何简单的方法可以自动选择正确的dll,就像其他.NET Framework库一样?
  4. 我们总是可以编写一些MSBuild xml,它会在构建时根据目标环境的位数自动交换引用,但这似乎是我们不应该为.NET Framework dll做的事情。是什么给了什么?

    谢谢!

1 个答案:

答案 0 :(得分:3)

可以有条件地引用与您的活动构建配置匹配的每个.dll文件。您需要手动编辑项目文件。添加对32位DLL的引用。然后保存项目并在文本编辑器中编辑.csproj文件。

搜索您添加的引用并添加Condition =“$(Platform)=='x86'”作为Reference元素的属性。然后制作Reference元素的另一个副本,并为x64版本调整它。以下是Oracle ODP.NET驱动程序的示例:

<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=AMD64" Condition="$(Platform) == 'x64'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>lib\x64\Oracle.DataAccess.dll</HintPath>
  <Private>True</Private>
</Reference>
<Reference Include="Oracle.DataAccess, Version=2.111.6.0, Culture=neutral, PublicKeyToken=89b483f429c47342, processorArchitecture=x86" Condition="$(Platform) == 'x86'">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>lib\x86\Oracle.DataAccess.dll</HintPath>
  <Private>True</Private>
</Reference>

需要注意的一件重要事情是,您将无法再使用“AnyCPU”配置。您需要具有x86或x64的显式构建配置。您尝试使用的.dll可能会对OS库进行本机调用,因此您的项目不再是平台无关的。

如果您只想维护1个构建配置,则可以使用x86并仅使用x86 / 32位版本。如果是Web应用程序,则需要将应用程序池置于32位模式。

编辑回答原始问题

  • 构建dll /可执行文件时,您有一些平台选项:任何CPU,x86,x64或Itanium。在托管代码中100%编写并且对本机库没有依赖性的代码通常被编译和编译。以AnyCPU分发。这是因为编译器生成的结果中间语言(IL)代码可以在.NET Framework的x86,x64和Itanium版本上运行。可以从特定于平台的应用程序(x86,x64,IA64)安全地引用以任何CPU为目标的库。 PresentationCore和WindowsBase不同的原因是它们依赖于本机代码。与在运行时解释的IL-code不同,本机代码中没有Any CPU的概念。由于本机代码依赖性,PresentationCore和WindowsBase .NET库需要以x86和x64的形式分发,因为AnyCPU是不可能的。
  • “添加引用”对话框应仅显示与您要定位的平台兼容的库。如果您的目标平台是x86,它应该只显示任何CPU和x86库。
  • 不幸的是,没有。如果你不能使用任何CPU,但仍然需要支持x86和x64,那么你需要设置多个构建配置(一个用于x86,一个用于x64)并有条件地引用你需要的32位和64位dll。我知道这样做的唯一方法是编辑项目文件,如上所述。您还需要构建这两种配置并分发单独的32位和64位版本的代码。如果有人依赖你的代码,他们将需要跳过相同的箍。