每个 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 版本。
这并不漂亮,但是向后和向前兼容又很难。