基于这个问题 https://stackoverflow.com/questions/4955009/getting-the-dte2-or-teamfoundationserverext-object-in-a-vs-package-project我尝试过以下方法:
EnvDTE80.DTE2 dte = ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE80.DTE2)) as EnvDTE80.DTE2;
不走运,空对象。
但基于这个 MSDN 文档 http://msdn.microsoft.com/en-us/library/68shb4dw.aspx我尝试了以下方法。
EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");
这有效并给了我 DTE2 对象。
从那里,我尝试了以下操作这个问题 https://stackoverflow.com/questions/8891089/how-can-i-open-the-tfs-changeset-details-dialog-view-using-a-visual-studio-add-i我尝试过以下方法:
VersionControlExt vce = dte.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt") as VersionControlExt;
不走运,空对象。
需要注意的一件事是,根据最后一个问题,它说使用Microsoft.VisualStudio.TeamFoundation.Client
命名空间。问题是,我找不到它。我什至确保使用相同的名称引用 dll。我能够引用所有其他名称空间。
最后,我尝试了以下方法teamfoundation.blogspot http://teamfoundation.blogspot.com/2008_02_01_archive.html.
EnvDTE.IVsExtensibility extensibility = GetService(typeof(EnvDTE.IVsExtensibility)) as EnvDTE.IVsExtensibility;
EnvDTE80.DTE2 dte = extensibility.GetGlobalsObject(null).DTE as EnvDTE80.DTE2;
//Followed by this to get the Version
VersionControlExt vce = dte.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt") as VersionControlExt;
这有效。
因此,虽然我已经成功获得了 DTE2 并从中获得了 VersionControlExt,但我觉得我已经进入了 Cargo Cult 程序员的领域,并且更愿意理解为什么这些都被认为是获得 DTE2 的有效方法,但它们都行为有所不同。