自动加载32位/64位程序集

3
我的C#/.NET程序编译成了AnyCPU,并引用了Microsoft.TeamFoundation.WorkItemTracking.Client.DataStoreLoader.dll,该dll随Visual Studio(或Team Explorer)一起安装。我的程序必须在没有安装VS的计算机上运行,包括32位和64位,因此我必须将此程序集与我的程序一起使用。它目前可以在32位计算机上运行,但不能在64位计算机上运行,因为它无法加载此程序集。

构建后,在bin\Debug中,我得到了该程序集的32位版本,VS可能从C:\Program Files (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已经将程序集安装到了32位和64位的GAC中,而.NET加载器知道如何加载正确的程序集。 我的问题:如果我无法安装VS,如何模拟这样的行为?
  • 选项1:编译两次,得到32位和64位的二进制文件,然后我猜我会在bin\Debug中得到正确的二进制文件。我不想这样做...
  • 选项2:在运行时机器上部署这些32/64位的程序集到GAC中。我希望保持我的部署简单的xcopy...

1
我脑海中能够想到的唯一解决方案就是将两个dll文件复制到您的bin文件夹中,在应用程序中检测32位/64位,使用AppDomain.AssemblyResolve事件并手动加载正确的dll文件。 有点麻烦... - Tony Hopkinson
1
你能否将你的应用程序编译为32位吗? - shf301
@shf301:考虑过这个问题,但我的程序依赖于另一个只有64位的汇编程序。 - Jonathan
2个回答

1
我不确定您能否在程序中重新分发此程序集,因为它们是Visual Studio的一部分。至少您需要查看哪些部分以及如何重新分发Visual Studio SDK,其中此程序集是其一部分。请参见这里这里
它们也是TFS Object Model的一部分,但是您也无法从该软件包中分发程序集。但是,您可以要求用户在使用您的软件之前下载并安装它。而且似乎它们只支持32位,因此您仍然需要将应用程序编译为32位。
另一种选择是直接使用Web服务。请参见这里。您可以随意调用它们作为AnyCPU。

0

那需要以提升的权限运行,我不确定我的程序是否能够做到。 - Jonathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接