Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# VisualStudio C x64,为什么添加引用选项,.NET选项卡指向x86 DLL而不是x64?_C#_Visual Studio 2008_Windows Server 2008_64 Bit - Fatal编程技术网

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

C# VisualStudio C x64,为什么添加引用选项,.NET选项卡指向x86 DLL而不是x64?,c#,visual-studio-2008,windows-server-2008,64-bit,C#,Visual Studio 2008,Windows Server 2008,64 Bit,我想创建一个x64应用程序 例如,当我想在tab.NET下的窗口AddReference中添加对system.data的引用时,我只看到x86 DLL,需要64位版本 我用VisualStudio2008安装了x64 我创建了一个项目,并在Configuration Manager下设置了x64 如何强制VisualStudio指向 请改为从C:\WINDOWS\Microsoft.NET\Framework64更正DLL C:\WINDOWS\Microsoft.NET\Framework?简

我想创建一个x64应用程序

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

我用VisualStudio2008安装了x64

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

如何强制VisualStudio指向 请改为从C:\WINDOWS\Microsoft.NET\Framework64更正DLL C:\WINDOWS\Microsoft.NET\Framework?

简短回答:不用担心-只需添加引用,.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都是更好的选择,您的二进制文件将在任一平台上运行。编译器警告会消失。

运行到同一个问题,是的,我也认为这是一个错误,您认为X64或x86 sGEn.EXE可以处理MSIL程序集,特别是当您必须参考框架程序集时。 我更喜欢自己构建msil程序集,但在我的混搭中加入了一个本地构建的第三方程序集。当项目尝试使用x86 sgen.exe生成序列化程序集时,它会抱怨第三方程序集的格式错误

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

<Reference Include="32bit.dll" Condition="'$(Platform)'=='x86'"/>
<Reference Include="64bit.dll" Condition="'$(Platform)'=='x64'"/>
看看这个答案:


我可以接受警告,但我在编译期间使用sgen,当我指向x86 DLL时,它会抛出一个错误。当我设置为任何CPU并部署在x64位服务器上时,我希望代码在x64中运行。我会在这种模式下运行吗?你到底为什么不在问题中提及这一点?我猜不出这个错误是什么样子的。我应该提一下,但我认为现在这无关紧要。可能是:SGEN:error:试图加载格式不正确的程序集。请使用64位版本的SGEN.exe,它位于Windows SDK安装目录的bin\x64文件夹中。将平台目标设置为任何CPU是通用的解决方法,您尚未提供任何证据表明需要x64。我有64位3部分DLL,因此需要64位代码。我正在使用此x64 sgen.exe,收到此错误消息。这是我的另一个问题。我找到的临时解决方案是在项目属性中设置Framework64的路径,但我不知道这是否会对客户端机器上的应用程序部署产生一些影响。我可以接受警告,但我在编译过程中使用sgen,当我指向x86 DLL时,它会抛出一个错误。通过反复试验,我最终发现System.Data,Web和System.EnterpriseServices以及我没有使用的更多可能是具有平台依赖性的框架程序集。从解决方案生成输出复制sgen行,将其更改为x64 sgen,然后将/reference:entries一次更改为Framework64,我最终使x64 sgen工作,但这真是一个麻烦。我认为将Framework64目录添加到ProjectProperties->reference Path中也可能有所帮助。