我正在编写一个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。
预先感谢
答案 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,然后我可以得到我所需要的。我对解决方案不满意,但我可以解决问题。如果有更好的解决方案,我在听:)