Visual Studio 2017中的自定义TFS签入策略

Ren*_*ogt 15 c# tfs visual-studio visual-studio-2017

不久之前,我开发了一个自定义的TFS签到策略,该策略在Visual Studio 2015中运行良好.现在我安装了Visual Studio 2017,并希望以与之前使用VS2015相同的方式注册签入策略程序集.但这不起作用.如何在VS2017中注册自定义签到策略程序集?

对于VS2015,我有这些注册表项:

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\TeamFoundation\SourceControl\Checkin Policies]
"MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll"
Run Code Online (Sandbox Code Playgroud)

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\TeamFoundation\SourceControl\Checkin Policies]
"MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll"
Run Code Online (Sandbox Code Playgroud)

因此我为VS2017(15.0)添加了这些键:

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies]
"MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll"
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0_Config\TeamFoundation\SourceControl\Checkin Policies]
"MyCheckInPolicy"="C:\\Program Files\\My\\MyCheckInPolicy.dll"
Run Code Online (Sandbox Code Playgroud)

但不幸的是,这不起作用:

  • 如果我打开Team Project SourceControl设置,请转到"签入策略"选项卡并尝试Add...策略,MyCheckInPolicy 不会出现1
  • 如果我打开已使用此签入策略的团队项目并执行上述操作,则会收到一条错误消息,告诉我assembly(mycheckinpolicy)"尚未注册".

当然,我在注册表更改后重新启动了IDE,但即使重新启动我的机器也无济于事.

到目前为止我发现的信息似乎表明,登记政策现在必须是扩展(vsix)的一部分,我不想相信.


我想这个问题来自一些在程序集加载到IDE时无法解析的引用.

MyCheckInPolicy项目引用Microsoft.TeamFoundation.VersionControl.Client.dllVS2015文件夹中的v14.0 C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer.
我试图从VS2017文件夹中引用相应的dll,但随后程序集在两个 IDE 中不起作用.

我也尝试使用Nuget包"Microsoft.TeamFoundation.VersionControl.All"v12.0.30723.2,并将输出目录中的所有文件(似乎包含包的所有程序集)部署到注册表项中提到的位置.这具有相同的结果:无法在VS2015和VS2017中加载策略.

我们正在使用TFS 12.0.30723.0.


1所以看起来VS2017甚至没有尝试加载程序集而不关心注册表项?

Per*_* P. 18

在Visual Studio 2017中,对可扩展性进行了重大更改.大部分注册表配置已移至"私有"注册表:

为了减少对注册表的影响,Visual Studio现在使用RegLoadAppKey函数将注册表项存储在%VsAppDataFolder%\ privateregistry.bin下的专用二进制文件中.只有极少数Visual Studio特定的密钥保留在系统注册表中.(链接)

通过将注册表项定义为vsix中.pkgdef文件的一部分,在安装时VS 2017将(我假设)将密钥写入私有注册表而不是实际的注册表,这是VS的早期版本中的情况.这将允许政策被拿起.

因此,以下是我在VS 2017中使用我们的策略的步骤:

  1. 安装Visual Studio SDK(如果您最初未选择工作负载,则可以通过修改安装来完成).
  2. 将新的VSIX项目添加到签入策略解决方案中
  3. .pkgdef使用以下内容将文件添加到VSIX项目(这是注册表项条目):

    [$RootKey$\TeamFoundation\SourceControl\Checkin Policies] "YourPolicy"="$PackageFolder$\YourPolicy.dll"

  4. source.extension.vsixmanifest在VSIX项目中修改(使用GUI向导):

    1. 安装目标:添加支持最低的VS版本:
      • Microsoft.VisualStudio.Community [15.0,16.0)
      • Microsoft.VisualStudio.IntegratedShell [15.0,16.0)
    2. 资产:
      • Microsoft.VisualStudio.Assembly
        • 当前解决方案中的项目
        • 项目:选择您的签到政策项目
      • Microsoft.VisualStudio.VsPackage
        • 文件系统上的文件
        • 路径:从步骤3中选择.pkgdef文件.
    3. 先决条件: Visual Studio core editor [15.0,16.0)
  5. 构建VSIX项目并分发/安装生成的vsix

这个 GitHub回购有助于拼凑所有东西.迁移到vsix时我发现了一些怪癖:

  1. 默认情况下,vsix安装现在是每用户.如果您在同一台计算机上的多个用户下运行VS,则需要为每个用户安装VS. 在vsixmanifest中有一个选项可以为所有用户安装扩展,但这需要提升.
  2. 我们的签入策略使用了app.config文件,vsix中不支持该文件.我不得不设置迁移.settings文件中.

  • 太谢谢了!我仍然需要将引用的dll更改为VS2017版本(不知道为什么nuget包的方式不起作用),但你的精彩解释完美无缺!我对VS2017有一些问题,比如用于tfs构建定义的自定义编辑器......但这些问题是另一天的问题......再次感谢. (2认同)