VisualStudio C#x64,为什么AddReference选项,.NET选项卡指向x86 DLL而不是x64?

我想创建一个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 )?

遇到同样的问题,是的,我也认为这是MS的一个错误。 您认为x64或x86 sgen.exe可以处理msil程序集,尤其是当您必须引用框架程序集时。

我更喜欢自己构建msil程序集,但是将本机构建的第三方程序集放入我的组合中。 当项目尝试使用x86 sgen.exe生成序列化程序集时,它会抱怨第三方程序集“格式错误”。

当我使用x64 sgen.exe时,它抱怨System.Data是“错误的格式”。 但我没有选择指向.csproj文件中的Framework64版本。

简短回答:不要担心 – 只需添加引用,.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

编译器仅使用引用程序集来加载类型信息。 这来自程序集的元数据。 x64特定程序集的元数据与x86程序集的元数据相同。 所以,没关系。 编译器会为它生成警告,如果您知道GAC中安装了64位版本的程序集,则可以自由地忽略它。 当你安装了64位版本的框架时。

您可能不应该做的一件事是选择x64作为项目的平台目标。 只有在必须使用仅在64位机器代码中可用的非托管代码时才需要这样做。 通常是COM服务器。 这是非常罕见的,典型的问题是只有32位版本可用。 将目标设置为Any CPU是更好的选择,您的二进制文件将在任一平台上运行。 编译器警告将消失。

   

看看这个答案:

如何用MSBuild引用不同版本的dll