Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 自动加载32-/64位程序集_C#_.net_32bit 64bit - Fatal编程技术网

C# 自动加载32-/64位程序集

C# 自动加载32-/64位程序集,c#,.net,32bit-64bit,C#,.net,32bit 64bit,我的C#/.NET程序编译为AnyCPU,并引用Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll,该程序随Visual Studio(或团队资源管理器)一起安装。我的程序必须在未安装VS的计算机上运行,包括32位和64位,因此我必须将此程序集与我的程序一起带上。它当前在32位计算机上运行,但不能在64位计算机上运行,因为它无法加载此程序集 生成后,在bin\Debug中我得到了这个程序集的32位版本,VS可能

我的C#/.NET程序编译为
AnyCPU
,并引用
Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
,该程序随Visual Studio(或团队资源管理器)一起安装。我的程序必须在未安装VS的计算机上运行,包括32位和64位,因此我必须将此程序集与我的程序一起带上。它当前在32位计算机上运行,但不能在64位计算机上运行,因为它无法加载此程序集

生成后,在bin\Debug中我得到了这个程序集的32位版本,VS可能从
C:\ProgramFiles(x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
中获取。这就是该程序在32位计算机上的工作方式。但是我的程序也以64位本地运行,32位程序集被加载,这怎么可能呢?为了检查,我给我写了一个小的PowerShell:

param([string] $path)
$AssemblyName = [Reflection.Assembly]::Loadfile($path).GetName()
write-output $AssemblyName | fl
并将其作为32位和64位运行:

> powershell.exe -ExecutionPolicy ByPass -f .\f.ps1 Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
(...)
CodeBase              : file:///C:/windows/assembly/GAC_64/Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader/11.0.0.0

> C:\Windows\SysWow64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -f .\f.ps1  Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
(...)
CodeBase              : file:///C:/windows/assembly/GAC_32/Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader/11.0.0.0__b03f5f7f11d50a3a/Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll
啊,看起来VS在GAC上安装了32位和64位的程序集,而.NET加载程序知道如何加载正确的程序集

我的问题:当我无法安装VS时,如何模拟这种行为

  • 选项1:编译两次32位和64位,然后我想我会在bin\Debug中得到正确的二进制文件。我不想那样做
  • 选项2:将这些32/64程序集部署到运行时计算机中的GAC。我想让我的部署保持在一个简单的xcopy

您可以尝试利用fusion API以编程方式在GAC中安装程序集


此处的更多详细信息:

我不确定您是否可以将此程序集与您的程序一起重新分发,因为它们是Visual Studio的一部分。至少您需要了解哪些部分以及如何重新分发此程序集所属的VisualStudioSDK。见和

它们也是的一部分,但您也不能从该包分发程序集。但是,在使用软件之前,您可以要求用户下载并安装该软件。看起来它们只有32位,所以您仍然需要将应用程序编译为32位


另一种选择是直接使用webservices。看见您可以毫无问题地将它们称为任何CPU。

我能想到的唯一一件事就是将这两个DLL复制到您的bin文件夹中,即应用程序中的detect 32/64,并使用AppDomain.AssemblyResolve事件手动加载正确的DLL。凌乱…你能把你的应用程序编译成32位吗?@shf301:考虑一下,但是我的程序依赖于另一个只有64位的程序集。这需要运行提升版,我不确定我的程序能不能做到。