我想创建一个x64应用程序。
当我想在选项卡.NET下的AddReference窗口中向system.data
添加引用时,我只看到x86 DLL,我需要64位版本。
我使用Visual Studio 2008 Windows Server 2008 x64。
我创建了一个项目,并在Configuration Manager下设置了x64。
我该怎么做才能强制Visual Studio指向
正确的DLL(来自C:\WINDOWS\Microsoft.NET\Framework64
是C:\WINDOWS\Microsoft.NET\Framework
)?
答案 0 :(得分:2)
遇到同样的问题,是的我也认为这是MS的一个错误。您认为x64或x86 sgen.exe可以处理msil程序集,尤其是当您必须引用框架程序集时。
我更喜欢自己构建msil程序集,但是将本机构建的第三方程序集放入我的组合中。当项目尝试使用x86 sgen.exe生成序列化程序集时,它会抱怨第三方程序集“格式错误。”
当我使用x64 sgen.exe时,它抱怨System.Data是“错误的格式”。但我没有选择指向.csproj文件中的Framework64版本。
答案 1 :(得分:1)
简短回答:不要担心 - 只需添加引用,.NET就会在运行时加载正确的程序集。
长答案:纯.NET程序集(例如所有系统程序集)实际上不是x86或x64。它们采用中间语言(MSIL),在运行时可以编译(“及时”)到本机x86或x64代码。您在“添加引用”对话框中看到的路径实际上并未添加到项目中(好吧,它可能是,但仅作为“提示”)。该项目实际上是指程序集的强名称 - 它的名称,版本,文化和公钥。在运行时,.NET将使用此信息来定位程序集,它可能从与添加引用的路径不同的路径加载。这有点违反直觉,但这就是它的工作原理。
如果您在启动应用程序时观察调试输出窗口,则可以自行检查:您将看到如下内容:
Loaded 'C:\WINDOWS\assembly\GAC_64\System.Data\2.0.0.0__b77a5c561934e089\System.Data.dll', Skipped loading symbols.
...即使参考路径可能类似于c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll
答案 2 :(得分:1)
编译器仅使用引用程序集来加载类型信息。这来自程序集的元数据。 x64特定程序集的元数据与x86程序集的元数据相同。所以,没关系。编译器会为它生成警告,如果您知道GAC中安装了64位版本的程序集,则可以自由地忽略它。当你安装了64位版本的框架时。
您可能不应该做的一件事是选择x64作为项目的平台目标。只有在必须使用仅在64位机器代码中可用的非托管代码时才需要这样做。通常是COM服务器。这是非常罕见的,典型的问题是只有32位版本可用。将目标设置保留为任何CPU是更好的选择,您的二进制文件将在任一平台上运行。编译器警告将消失。
答案 3 :(得分:1)
<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
<Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>
看看这个答案: