自动加载32/64位程序集

时间:2013-09-08 14:03:35

标签: 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:\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 ...

2 个答案:

答案 0 :(得分:1)

我不确定您是否可以使用您的程序重新分发此程序集,因为它们是Visual Studio的一部分。至少您需要查看哪些部分以及如何重新分发此程序集所属的Visual Studio SDK。请参阅herehere

它们也是TFS Object Model的一部分,但您也无法从该包中分发程序集。但是,您可以要求用户在使用您的软件之前下载并安装该软件。它们似乎只是32位,因此您仍然需要将应用程序编译为32位。

另一种方法是直接使用webservices。见here。你可以毫无问题地称他们为AnyCPU。

答案 1 :(得分:0)

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

此处有更多详情:http://www.codeproject.com/Articles/8285/GAC-API-Interface