【问题标题】:How to handle TFS DLLs with two different versions of Visual Studio如何使用两个不同版本的 Visual Studio 处理 TFS DLL
【发布时间】:2017-03-22 00:07:24
【问题描述】:

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

我们最近更新到 Visual Studio 2015,这就是问题所在。我不得不从这里重新添加对 DLL 的引用。现在该程序可以在我的机器上运行,但不能在使用 2013 版 Visual Studio 的其他任何人上运行。

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

我似乎无法找到一种方法来让它在两台机器上都能正常工作。

有什么想法吗?

代码的获取工作区部分特别失败。

 workspace = versionControlServer.GetWorkspace(path);

它总是返回 no items mapped 异常。

任何使用版本控制服务器的方法总是返回没有映射错误。

【问题讨论】:

    标签: c# visual-studio tfs


    【解决方案1】:

    每个 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>
    

    您也可以选择为程序集的特定文件位置提供&lt;HintPath&gt;

    在上述链接中,这些文件的位置是通过从注册表中查找 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 版本。

    这并不漂亮,但是向后和向前兼容又很难。

    【讨论】:

    • 我确实在开始时连接到 uri,它返回一个带有正确信息的版本控制服务器对象,只是当我点击版本控制服务器方法时,他们看不到工作区。如果我使用查询工作区,我可以看到所有工作区,我可以从那里设置工作区,但它总是在版本控制服务器方法上出错,并且使用非工作的 gofolder 映射。
    • 谢谢,这对我帮助很大。一个星期以来一直在为此绞尽脑汁
    • Workstation.UpdateWorkspaceInfoCache 解决了我的问题。
    【解决方案2】:

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

    【讨论】:

    • 如果我安装了 nuget 包,它将在我的机器上本地运行,但是当我在远程机器上尝试该程序时,它会抛出错误“***没有工作地图文件夹”如果我只需将 dll 切换到 V12 即可。
    猜你喜欢
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多