Как я уже сказал, у меня есть решение для моей проблемы (с некоторыми недостатками).
Допустим, мое расширение имеет имя 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Проводник (программно) к базовому пути и вынудите Студию загрузить Проводник, и тогда я смогу получить то, что мне нужно.Я не так доволен своим решением, но я работаю.Если есть лучшее решение, я слушаю :)