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