【问题标题】:VisualStudio C# x64, why AddReference option, .NET tab points to x86 DLL instead of x64?VisualStudio C# x64,为什么 AddReference 选项,.NET 选项卡指向 x86 DLL 而不是 x64?
【发布时间】:2009-12-30 03:58:43
【问题描述】:

我想创建一个 x64 应用程序。

当我想在 .NET 选项卡下的窗口 AddReference 中添加对 system.data 的引用时,我只看到 x86 DLL,我需要 64 位版本。

我有 Windows Server 2008 x64 和 Visual Studio 2008。

我创建了一个项目,并在 Configuration Manager 下设置了 x64。

如何强制 Visual Studio 指向 正确的 DLL(从 C:\WINDOWS\Microsoft.NET\Framework64 改为 C:\WINDOWS\Microsoft.NET\Framework)?

【问题讨论】:

    标签: c# visual-studio-2008 windows-server-2008 64-bit


    【解决方案1】:

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

    我更喜欢自己构建 msil 程序集,但在我的组合中加入了一个本地构建的第 3 方程序集。当项目尝试使用 x86 sgen.exe 生成序列化程序集时,它抱怨第 3 方程序集“格式错误”。

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

    【讨论】:

    • 经过反复试验,我最终发现 System.Data、System.Web 和 System.EnterpriseServices(可能还有更多我没有使用)是具有平台依赖性的框架程序集。从解决方案构建输出中复制 sgen 行,将其更改为 x64 sgen,然后将 /reference: 条目一次更改为 Framework64,我最终让 x64 sgen 工作,但真是麻烦。
    • 我认为将 framework64 目录添加到 ProjectProperties->Reference Paths 也可能会有所帮助。
    【解决方案2】:

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

    【讨论】:

    • 好吧,我可以忍受警告,但我在编译期间使用 sgen,当我指向 x86 dll 时它会引发错误。
    【解决方案3】:

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

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

    【讨论】:

    • 好吧,我可以忍受警告,但我在编译期间使用 sgen,当我指向 x86 dll 时它会引发错误。当我设置为任何 CPU 并部署在 x64 位服务器上时,我希望代码在 x64 中运行,我会在这种模式下运行吗?
    • 为什么你不会在你的问题中提到这个?我猜不出错误是什么样子的。
    • 我应该提一下,但我认为此时没关系。它看起来像:SGEN:错误:尝试加载格式不正确的程序集
    • 使用 64 位版本的 sgen.exe,它位于 Windows SDK 安装目录的 bin\x64 文件夹中。将 Platform Target 设置为 Any CPU 是通用的解决方法,您尚未提供任何证据表明您需要 x64。
    • 我有 64 位 3part dll,所以我需要 64 位代码。我正在使用这个 x64 sgen.exe 并收到此错误消息。 (这里有我的另一个问题stackoverflow.com/questions/1980278/…)。我找到的临时解决方案是在项目属性中设置Framework64的路径,但我想知道它是否会对客户端机器上的应用程序部署产生一些影响。
    【解决方案4】:
    <Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
    <Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>
    

    看看这个答案:

    How to reference different version of dll with MSBuild

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多