如何在 C# 中以编程方式订阅 TFS 的 VersionControlServer 事件?
How to subscribe to TFS's VersionControlServer Events programatically in C#?
我正在编写一个 Visual Studio 2015 扩展,我想在其中订阅一些 TFS 的 VersionControlServer 事件。但实际上 none 的事件被解雇了。我想我已经知道为什么了,但我不知道如何让它为我的目的工作。微软的文档也很差,根本不存在...
问题是:有没有办法从我的分机订阅事件。
我已经研究了很多主题,但找不到对我有帮助的任何内容。我的代码如下所示:
var tfsProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection (TfsPath, new UICredentialsProvider ());
var tfsVersionControlServer = tfsProjectCollection.GetService<VersionControlServer> ();
tfsVersionControlServer.CommitCheckin += TfsVersionControlServer_CommitCheckin;
这里的问题是,VersionControlServer 与 Visual Studio 使用的实例不同。因此,例如,如果我制作一个搁置集,则该事件不会触发。仅当我使用此处的实例以编程方式进行搁置时,我才会触发事件。
除了这个问题,我的扩展程序工作正常。我的扩展程序在启动时进行初始化,并在 Visual Studio 启动期间订阅事件。现在,如果我创建 Shelveset,我希望触发 BeforeShelvePendingChange 事件。
提前致谢
正如我已经说过的,我找到了解决问题的方法(但有一些缺点)。
假设我的扩展名是 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 的新实例需要打开源代码管理资源管理器。如果用户在没有资源管理器的情况下启动他的Visual Studio,您将始终为 VersioncontrolServer 获取 null。
我所做的解决方法是,我正在等待 Studio 启动,然后我在源代码管理资源管理器中(以编程方式)导航到基本路径并强制 Studio 加载资源管理器,然后我能够得到我需要的东西。我对我的解决方案不太满意,但我会继续努力。如果有更好的解决方案,我正在听:)
我正在编写一个 Visual Studio 2015 扩展,我想在其中订阅一些 TFS 的 VersionControlServer 事件。但实际上 none 的事件被解雇了。我想我已经知道为什么了,但我不知道如何让它为我的目的工作。微软的文档也很差,根本不存在...
问题是:有没有办法从我的分机订阅事件。
我已经研究了很多主题,但找不到对我有帮助的任何内容。我的代码如下所示:
var tfsProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection (TfsPath, new UICredentialsProvider ());
var tfsVersionControlServer = tfsProjectCollection.GetService<VersionControlServer> ();
tfsVersionControlServer.CommitCheckin += TfsVersionControlServer_CommitCheckin;
这里的问题是,VersionControlServer 与 Visual Studio 使用的实例不同。因此,例如,如果我制作一个搁置集,则该事件不会触发。仅当我使用此处的实例以编程方式进行搁置时,我才会触发事件。
除了这个问题,我的扩展程序工作正常。我的扩展程序在启动时进行初始化,并在 Visual Studio 启动期间订阅事件。现在,如果我创建 Shelveset,我希望触发 BeforeShelvePendingChange 事件。
提前致谢
正如我已经说过的,我找到了解决问题的方法(但有一些缺点)。
假设我的扩展名是 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 的新实例需要打开源代码管理资源管理器。如果用户在没有资源管理器的情况下启动他的Visual Studio,您将始终为 VersioncontrolServer 获取 null。
我所做的解决方法是,我正在等待 Studio 启动,然后我在源代码管理资源管理器中(以编程方式)导航到基本路径并强制 Studio 加载资源管理器,然后我能够得到我需要的东西。我对我的解决方案不太满意,但我会继续努力。如果有更好的解决方案,我正在听:)