簡體   English   中英

這些獲取DTE2的方法有什么區別(Visual Studio 2013)

[英]What is the difference between these methods of getting DTE2 (Visual Studio 2013)

基於這個問題,我嘗試了以下內容:

EnvDTE80.DTE2 dte = ServiceProvider.GlobalProvider.GetService(typeof(EnvDTE80.DTE2)) as EnvDTE80.DTE2;

沒有運氣,空對象。

但基於此MSDN文檔,我嘗試了以下內容。

EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");

這工作,並給了我DTE2對象。

從那里,我嘗試了以下這個問題,我嘗試了以下內容:

VersionControlExt vce = dte.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt") as VersionControlExt;

沒有運氣,空對象。

有一點需要注意的是,根據最后一個問題,它說要使用Microsoft.VisualStudio.TeamFoundation.Client命名空間。 問題是,我找不到它。 我甚至確保用相同的名稱引用dll。 我能夠引用所有其他名稱空間。

最后,我嘗試了teamfoundation.blogspot中的以下內容

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的有效方法但他們都表現不同。

從擴展中獲取DTE實例的正確方法是使用擴展API為該擴展提供的方式。

  • 對於宏,它是全局DTE實例。
  • 對於加載項,它是IDTExtensibility2接口的OnConnection方法傳遞的實例,加載項必須實現。
  • 對於它正在使用的包:

    base.GetService(typeof運算(EnvDTE.DTE))

(請注意,“base”是指MPF Package類,因此您使用的是可擴展性API。如果您使用全局提供程序,則還使用了可擴展性API)

但與此無關的是,標記為自動加載的軟件包會發生以下幾個問題:

1)當啟動VS時將包標記為自動加載時返回的DTE值為null(而不是在需要時加載)

2)DTE不為空,但是某些屬性(如DTE.MainWindow)仍為空,因為VS實例尚未完全初始化。

要防止這兩種情況,您必須訂閱VS IDE已完全初始化且不處於僵屍狀態的通知。 看看你必須使用的可怕的黑客: HOWTO:從Visual Studio包中獲取EnvDTE.DTE實例。

從擴展中獲取DTE實例的錯誤方法是使用COM自動化(通過.NET Framework API)而不是使用可擴展性API(MSDN文檔提到這種方法很可怕):

EnvDTE80.DTE2 dte = (EnvDTE80.DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.12.0");

因為COM自動化中的GetObject(ProgId)(或者諸如Marshal.GetActiveObject(ProgId)之類的.NET包裝器)用於附加到所需ProgId(“VisualStudio.DTE.12.0”)的運行實例, 如果你有超過一個運行實例,您的擴展可能會結束獲取對另一個實例的引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM