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

C# Visual Studio 2017中的自定义TFS签入策略,c#,visual-studio,tfs,visual-studio-2017,C#,Visual Studio,Tfs,Visual Studio 2017,不久前,我开发了一个自定义TFS签入策略,该策略在Visual Studio 2015中运行良好。 现在我安装了Visual Studio 2017,并希望以与之前VS2015相同的方式注册签入策略程序集。但这是行不通的如何向VS2017注册自定义签入策略程序集? 对于VS2015,我有以下注册表项: [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\TeamFoundation\SourceControl\

不久前,我开发了一个自定义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"

因此,我为VS2017添加了这些密钥(
15.0
):

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

  • 如果我打开团队项目SourceControl设置,请转到“签入策略”选项卡并尝试添加。。。策略,
    MyCheckInPolicy
    不出现1
  • 如果我打开已经使用此签入策略的团队项目并执行上述操作,则会收到一条错误消息,告诉我程序集(
    mycheckinpolicy
    )“尚未注册”
当然,我在注册表更改后重新启动了IDE,但即使是我的机器也没有帮助

到目前为止,我发现的问题似乎表明签入策略现在必须是扩展(vsix)的一部分,我不想相信这一点


我猜问题来自一些引用,当程序集加载到IDE中时,这些引用无法解决

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

我还尝试使用Nuget包“Microsoft.TeamFoundation.VersionControl.All”v12.0.30723.2,并将输出目录(似乎包含包的所有程序集)中的所有文件部署到注册表项中提到的位置。这产生了相同的结果:该策略既不能在VS2015中加载,也不能在VS2017中加载

我们正在使用TFS 12.0.30723.0



1 VS2017似乎甚至不尝试加载程序集,也不关心注册表项?

在Visual Studio 2017中,扩展性非常重要。大部分注册表配置已移到“专用”注册表中:

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

通过将注册表项定义为vsix中.pkgdef文件的一部分,在安装VS 2017时,VS 2017将(我假设)将注册表项写入私有注册表,而不是实际注册表,这是VS以前版本的情况。这将允许拾取策略

因此,以下是我为使我们的政策在VS 2017中发挥作用而采取的步骤:

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

    [$RootKey$\TeamFoundation\SourceControl\Checkin策略]
    “YourPolicy”=“$PackageFolder$\YourPolicy.dll”

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

  • 安装目标:添加支持的最低VS版本:
    • Microsoft.VisualStudio.Community[15.0,16.0)
    • Microsoft.VisualStudio.IntegratedShell[15.0,16.0)
  • 资产:
    • Microsoft.VisualStudio.Assembly
      • 当前解决方案中的项目
      • 项目:选择签入策略项目
    • Microsoft.VisualStudio.VsPackage
      • 文件系统上的文件
      • 路径:从步骤3中选择.pkgdef文件
  • 先决条件:
    Visual Studio核心编辑器[15.0,16.0)
  • 构建VSIX项目并分发/安装生成的VSIX
  • GitHub repo有助于将所有内容拼接在一起。我在迁移到vsix时发现了一些怪癖:

  • 默认情况下,vsix安装现在为每个用户。如果在同一台计算机上的多个用户下操作VS,则需要为每个用户安装vsix。vsixmanifest中有一个选项,可以为所有用户安装扩展,但这需要提升
  • 我们的签入策略使用了一个app.config文件,该文件在vsix中不受支持。我必须将我们的设置添加到
    .settings
    文件中

  • 为香港大学增加这把钥匙对我很有帮助:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies
    
    希望能有帮助。 谢谢
    Wilsade

    非常感谢!我仍然必须将引用的dll更改为VS2017版本(不知道为什么nuget包方式不起作用),但你精彩的解释效果非常好!我对VS2017还有一些问题,比如tfs构建定义的自定义编辑器…但这些是另一天的问题…再次感谢。没问题,很高兴能提供帮助。我只是经历了昨天解决这一问题的痛苦,因为没有任何问题。我尝试创建了一个新的签入策略y遵循您的步骤(谢谢!),但我在Visual Studio中找不到我的策略。我想要的是一个简单的策略,用于检查所有挂起的更改文件中的某个单词,如果该单词存在,则签入将失败。可能已经可以使用标准工具进行签入了?提前感谢!@Lumo是您使用TFS/VS 2017引用的签入策略(版本15.0.0.0)?我刚刚添加了NuGet软件包“Microsoft.TeamFoundation.VersionControl.All”,唯一可选择的版本是12.0.30723.2。我们正在使用TFS 2015(版本14.95.25229.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"
    
    HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\15.0\TeamFoundation\SourceControl\Checkin Policies