如何在C#中以编程方式订阅TFS的VersionControlServer事件?

时间:2019-07-02 11:21:58

标签: c# visual-studio tfs tfs2015 visual-studio-extensions

我正在编写一个Visual Studio 2015扩展,我想在其中订阅一些TFS的VersionControlServer事件。但是实际上没有任何事件被触发。我想我已经知道为什么了,但是我不知道如何使它达到我的目的。微软的文档也很差,而且根本不存在...

问题是:有没有办法从我的扩展程序中订阅事件。

我已经研究了许多线程,找不到任何对我有用的东西。我的代码如下:

var tfsProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection (TfsPath, new UICredentialsProvider ());
var tfsVersionControlServer = tfsProjectCollection.GetService<VersionControlServer> ();

tfsVersionControlServer.CommitCheckin += TfsVersionControlServer_CommitCheckin;

这里的问题是,VersionControlServer与Visual Studio使用的实例不同。因此,例如,如果我制作架子,则该事件不会触发。仅当我将对此处拥有的实例进行编程搁置时,才会触发该事件。

除此问题外,我的扩展程序工作正常。我的扩展程序在启动时进行了初始化,并在Visual Studio启动期间订阅了这些事件。现在,如果我创建Shelveset,则希望触发事件BeforeShelvePendingChange。

预先感谢

1 个答案:

答案 0 :(得分:1)

正如我已经说过的,我为我的问题找到了解决方案(有一些缺点)。

让我们说我的扩展名是MyExtension:

首先,我在MyExtension.cs中添加了一个属性

 public EnvDTE.DTE DTEObject { get; set; }

然后在MyExtension Package .cs中,可以在初始化程序包后立即获取DTEObject:

protected override void Initialize ()
{
  MyExtension.Initialize (this);
  base.Initialize ();
  MyExtension.Instance.DTEObject = (EnvDTE.DTE)base.GetService (typeof (Microsoft.VisualStudio.Shell.Interop.SDTE));
}

现在,我可以使用扩展中的DTEObject并通过GetObject获取任何对象。就我而言,我正在获取VersionControlEx的当前实例。

var tfsVersionControlExt = DTEObject.GetObject ("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt") as Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt;

然后我可以获取此实例的VersionControlServer:

TfsVersionControlServer = tfsVersionControlExt.Explorer.Workspace.VersionControlServer;

此处的缺点是,Visual Studio的新实例需要打开源代码管理资源管理器。如果用户在没有资源管理器的情况下启动Visual Studio,则VersioncontrolServer始终为null。

我所做的解决方法是,我正在等待Studio启动,然后在Source Control Explorer中(以编程方式)导航到基本路径,并强制Studio加载Explorer,然后我可以得到我所需要的。我对解决方案不满意,但我可以解决问题。如果有更好的解决方案,我在听:)