【问题标题】:How to subscribe to TFS's VersionControlServer Events programatically in C#?如何在 C# 中以编程方式订阅 TFS 的 VersionControlServer 事件?
【发布时间】:2019-11-13 00:50:52
【问题描述】:

我正在编写一个 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 事件。

提前致谢

【问题讨论】:

  • 类似于this issue 的东西?我还纠结于如何获取正确的实例。
  • 我想我们也有类似的问题。经过数小时的尝试和错误,我想出了一个有一些缺点的解决方案,但我会接受它们。我会在当天尽快/稍后发布我的解决方案。
  • 这可能会非常好,谢谢!我被困在如何获得正确的实例让我多次执行某些操作。

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


【解决方案1】:

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

假设我的扩展名是 MyExtension:

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

 public EnvDTE.DTE DTEObject { get; set; }

然后在 MyExtensionPackage.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 的新实例需要打开源代码管理资源管理器。如果用户在没有 Explorer 的情况下启动他的 Visual Studio,则 VersioncontrolServer 将始终为 null。

我所做的解决方法是,我正在等待 Studio 启动,然后在源代码管理资源管理器中(以编程方式)导航到基本路径并强制 Studio 加载资源管理器,然后我就可以得到我需要的。我对我的解决方案不太满意,但我继续努力。如果有更好的解决方案,我正在听:)

【讨论】:

  • 您好 Evvi,感谢您的分享,请将您的回复标记为答案,这将有助于其他社区成员更轻松地搜索此有用信息,这只是一个提醒 :)
猜你喜欢
  • 2021-04-12
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多