PresentationCore.dll和WindowsBase.dll都包含在Microsoft .NET Framework 3.0中,每个dll的两个版本都安装到磁盘上:
在添加对这些dll的引用之前,我们的ASP.NET Web应用程序能够针对“任何CPU”进行编译,并且可以在32位或64位模式下运行而没有任何问题。通过标准的“添加引用”对话框(添加引用 - > .NET - > PresentationCore)向PresentationCore添加引用后,Web应用程序在64位模式下失败,并出现以下错误:
无法加载文件或程序集“PresentationCore”或其依赖项之一。试图加载格式不正确的程序。
显然这是因为64位应用程序池正在尝试加载32位版本的PresentationCore dll而失败。
现在,我对此感到有点困惑......
我们总是可以编写一些MSBuild xml,它会在构建时根据目标环境的位数自动交换引用,但这似乎是我们不应该为.NET Framework dll做的事情。是什么给了什么?
谢谢!
答案 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位模式。
编辑回答原始问题