所以我正在开发一个通过 API 与 TFS 交互的程序,我正在运行 checkin checkout 、获取工作区等操作。
我们最近更新到了 Visual studio 2015,这就是问题发生的地方。我必须从这里重新添加对 DLL 的引用。现在,该程序可以在我的计算机上运行,但不能在任何使用 2013 版 Visual Studio 的其他计算机上运行。
如果我从旧版本的 Visual Studio 中获取 DLL,它可以在他们的计算机上运行,但不能在我的计算机上运行。
我似乎找不到一种方法可以让它在两台机器上工作。
有什么想法吗?
它在代码的获取工作空间部分特别失败。
workspace = versionControlServer.GetWorkspace(path);
它总是返回“无项目映射”异常。
任何使用版本控制服务器的方法总是返回没有映射错误。
最佳答案
每个 Visual Studio SDK 版本都使用 SDK 的程序集版本所特有的服务器注册表。因此,VS2013 中的服务器注册在 VS2015 中不会立即可见,并且使用 v14 SDK 的调用不会看到使用 V12 SDK 所做的映射。这就是您遇到的情况。
让 TFS 填充服务器数据
通过在连接时提供项目集合 uri,服务器将能够提供正确的工作区映射,并且一切都会正常工作。
如果您希望实用程序在不首先连接到服务器的情况下检测设置,您需要检测这种情况,您可以pop-up the server registration UI by calling the TeamProjectPicker to register the connection .
如果您能够连接到远程服务器,但本地工作区尚未转移,请调用 Workstation.UpdateWorkspaceInfoCache
方法让它填充您的 SDK 版本的数据。
复制 TFS 服务器连接信息的另一种方法是复制以下相应的注册表项:
HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\{VERSION}\TeamFoundation\Instances
至 14.0
在使用您的 API 版本建立与服务器的连接之前,请先创建树。您只需注册服务器一次,连接时即可复制设置。
构建实用程序的特定版本
或者您确实可以提供专门为某个版本的 SDK 构建的版本。 One way of handling this can be found in this open source project 。它使用项目配置有条件地加载一组引用或另一组引用。这样,您就可以使用 Visual Studio 中的“解决方案配置”下拉列表在要构建的版本之间切换:
<Choose>
<When Condition="'$(TfsVersion)' == '12.0'">
<Reference Include="Microsoft.TeamFoundation.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Microsoft.TeamFoundation.WorkItemTracking.Client, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.WorkItemTracking.Common, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
</When>
<When Condition="'$(TfsVersion)' == '14.0' Or '$(TfsVersion)' == '14.1'">
<Reference Include="Microsoft.TeamFoundation.Client, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Microsoft.TeamFoundation.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
</Reference>
<Reference Include="Microsoft.TeamFoundation.WorkItemTracking.Client, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.TeamFoundation.WorkItemTracking.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>False</SpecificVersion>
<Private>True</Private>
</Reference>
</When>
</Choose>
您可以选择提供<HintPath>
以及程序集的特定文件位置。
在上面提到的链接中,通过从注册表中查找 Visual Studio 安装位置来自动检测这些文件的位置(以获得额外的奖励积分)。
TFS SDK 版本之间存在一些重大更改。因此,您可能需要使用编译器常量来选择要使用的代码。引用的示例按如下方式执行此操作:
<Choose>
<When Condition="'$(TfsVersion)' == '14.0' or '$(TfsVersion)' == '14.1'">
<PropertyGroup>
<DefineConstants Condition="'$(TfsVersion)' == '14.0'">$(DefineConstants);TFS2015</DefineConstants>
<DefineConstants Condition="'$(TfsVersion)' == '14.1'">$(DefineConstants);TFS2015u1;TFS2015</DefineConstants>
</PropertyGroup>
</When>
<When Condition="'$(TfsVersion)' == '14.0' or '$(TfsVersion)' == '14.1'">
<PropertyGroup>
<DefineConstants Condition="'$(TfsVersion)' == '12.0'">$(DefineConstants);TFS2013</DefineConstants>
</PropertyGroup>
</When>
</Choose>
在代码中你can then do the following :
#if TFS2015 || TFS2015u1
using ILocationService = Microsoft.VisualStudio.Services.Location.Server.ILocationService;
#elif TFS2013
using ILocationService = Microsoft.TeamFoundation.Framework.Server.TeamFoundationLocationService;
#endif
指示编译器针对特定 SDK 版本使用代码的特定部分。
这并不漂亮,但向后和向前兼容性又很困难。
关于c# - 如何使用两个不同版本的 Visual Studio 处理 TFS DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36891427/