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,但失败了。
现在,我对此有点困惑......
- 其他 .NET Framework dll 似乎可以在 x64 和 x86 版本之间无缝切换(分别从 Microsoft.NET/Framework64 或 Microsoft.NET/Framework 加载)。为什么PresentationCore 和WindowsBase 有什么不同?
- 为什么 Visual Studio 在“添加引用”对话框的“.NET”选项卡下似乎只提供 32 位版本?如果我想要 64 位版本,我必须“浏览”它。
- 是否有任何简单的方法可以自动选择正确的 dll,就像其他 .NET Framework 库发生的情况一样?
我们总是可以编写一些 MSBuild xml,它会在构建时根据目标环境的位数自动交换引用,但这似乎是我们不必为 .NET Framework dll 执行的操作。是什么赋予了?
Thanks!
可以有条件地引用与您的活动构建配置匹配的每个 .dll 文件。您需要手动编辑项目文件。添加对 32 位 DLL 的引用。然后保存项目并在文本编辑器中编辑 .csproj 文件。
搜索您添加的引用,并将 Condition="$(Platform) == 'x86'" 添加为 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 可能会对操作系统库进行本机调用,因此您的项目不再与平台无关。
如果您只想维护 1 个构建配置,则可以使用 x86 并仅使用 x86/32 位版本。如果是 Web 应用程序,则需要将应用程序池设置为 32 位模式。
编辑以回答您原来的问题
- 当您构建 dll/可执行文件时,您有几个平台选项:任何 CPU、x86、x64 或 Itanium。 100% 用托管代码编写且不依赖于本机库的代码通常作为 AnyCPU 进行编译和分发。这是因为编译器生成的中间语言 (IL) 代码可以在 x86、x64 和 Itanium 版本的 .NET Framework 上运行。可以从特定于平台(x86、x64、IA64)的应用程序安全地引用面向任何 CPU 的库。 PresentationCore 和 WindowsBase 不同的原因是它们对本机代码有依赖性。与在运行时解释的 IL 代码不同,本机代码中没有 Any CPU 的概念。由于本机代码依赖性,PresentationCore 和 WindowsBase .NET 库需要作为 x86 和 x64 分发,因为 AnyCPU 是不可能的。
- “添加引用”对话框应仅显示与您的目标平台兼容的库。如果您的目标平台是 x86,它应该只显示任何 CPU 和 x86 库。
- 很不幸的是,不行。如果您无法使用任何 CPU,但仍需要支持 x86 和 x64,那么您需要设置多个构建配置(一种用于 x86,一种用于 x64),并有条件地引用您需要的 32 位和 64 位 dll。我知道执行此操作的唯一方法是编辑项目文件,如上所述。您将需要构建这两种配置并分发单独的 32 位和 64 位版本的代码。如果有人依赖您的代码,他们将需要经历同样的困难。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)