3

我的 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 ...
4

2 回答 2

1

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

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

另一种方法是直接使用网络服务。见这里。您可以毫无问题地称它们为 AnyCPU。

于 2013-09-08T21:25:48.683 回答
0

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

更多细节在这里: http: //www.codeproject.com/Articles/8285/GAC-API-Interface

于 2013-09-08T20:37:50.860 回答