如何使用两个不同版本的Visual Studio处理TFS DLL

时间:2016-04-27 13:34:43

标签: c# visual-studio tfs

所以我正在开发一个通过API与TFS交互的程序,我正在运行签出签出,获取工作区等等。

我们最近更新到Visual Studio 2015,这就是问题发生的地方。我不得不从这里重新添加我对DLL的引用。现在该程序可以在我的机器上运行,但不适用于任何使用2013版Visual Studio的用户。

如果我从旧版本的Visual Studio中获取DLL,它可以在他们的机器上运行,但不适用于我的。

我似乎无法找到一种能够在两台机器上运行的方法。

有什么想法吗?

它在代码的get workspace部分特别失败。

 workspace = versionControlServer.GetWorkspace(path);

它始终返回无项目映射的异常。

使用versioncontrolserver的任何方法总是返回没有映射错误。

2 个答案:

答案 0 :(得分:2)

每个visual studio SDK版本都使用一个服务器注册表,该注册表是SDK的Assembly版本所独有的。因此,在VS2015中,VS2013中的服务器注册不会立即可见,使用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
在使用您的API版本建立与服务器的连接之前,

14.0树。您只需要注册服务器一次,以便在连接时复制设置。

构建实用程序的特定于版本的版本

或者您确实可以提供专门为一个版本的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版本的代码的特定部分。

它并不漂亮,但后来再次向后兼容很难。

答案 1 :(得分:0)

您可以将TFS API的nuget package安装到项目中,然后将其用作参考。这不依赖于VS版本,只需要在其他机器上构建项目之前恢复nuget包。