Как подписаться на события VersionControlServer TFS программно в C #? - PullRequest
1 голос
/ 02 июля 2019

Я пишу расширение Visual Studio 2015, где хочу подписаться на некоторые из событий VersionControlServer в TFS. Но на самом деле ни одно из событий не происходит. Я думаю, я уже знаю почему, но я не знаю, как заставить это работать в моих целях. Также документация от Microsoft довольно скудная и буквально не существует ...

Вопрос: есть ли способ подписаться на события из моего добавочного номера.

Я уже исследовал множество тем и не смог найти ничего полезного для меня. Мой код выглядит так:

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

tfsVersionControlServer.CommitCheckin += TfsVersionControlServer_CommitCheckin;

Проблема здесь в том, что VersionControlServer - это не тот экземпляр, который использует Visual Studio. Так что, если я, например, сделаю полку, событие не сработает. Только если я запрограммирую откладывание стеллажей с имеющимся у меня экземпляром, я получу событие.

Мое расширение работает нормально, кроме этой проблемы. Мое расширение инициализируется при запуске и подписывается во время запуска Visual Studio на события. Теперь, если я создаю Shelveset, я бы хотел запустить событие BeforeShelvePendingChange.

Заранее спасибо

1 Ответ

1 голос
/ 05 июля 2019

Как я уже сказал, у меня есть решение для моей проблемы (с некоторыми недостатками).

Допустим, мое расширение имеет имя MyExtension:

Сначала я добавил свойство в MyExtension.cs.

 public EnvDTE.DTE DTEObject { get; set; }

Затем в MyExtension Пакет .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 должен быть открыт Source Control Explorer.Если пользователь запускает свою Visual Studio без проводника, вы всегда будете получать значение NULL для VersioncontrolServer.

Обходной путь, который я сделал, заключается в том, что я жду, пока Studio запустится, а затем перейду в Source ControlПроводник (программно) к базовому пути и вынудите Студию загрузить Проводник, и тогда я смогу получить то, что мне нужно.Я не так доволен своим решением, но я работаю.Если есть лучшее решение, я слушаю :)

...