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

标签 c# visual-studio tfs

所以我正在开发一个通过 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/

相关文章:

c# - 外部别名在 C# 中的作用是什么?

c# - ASP.NET 核心 : ShortName in the Display attribute (DataAnnotations)

c# - 为什么使用 PrimarySearcher 比 FindByIdentity() 更快?

visual-studio - 在运行外部工具之前,可以通过任何方法使Visual Studio保存文件?

javascript - MVC 中元标记内容 url :? 的替代方案是什么

git - 如何在一个 git 仓库中管理两个 TFS 项目?

c# - 从其他 .dll 加载服务并隔离运行它们

c# - Visual Studio 2010 显示代码隐藏的可用事件

TFS 项目组织

tfs - 如何以编程方式将用户添加到 TFS