繁体   English   中英

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

[英]VisualStudio C# x64, why AddReference option, .NET tab points to x86 DLL instead of 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程序集,但将本地构建的第3方程序集扔进我的混音中。 当项目尝试使用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位版本可用。 将目标设置为“任何CPU”是更好的选择,您的二进制文件将在任一平台上运行。 并且编译器警告将消失。

<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
<Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>

看这个答案:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM