2011-01-27 51 views
0

我試圖掛鉤幾個Visual Studio事件。不幸的是我在第一步失敗了。事件處理程序永遠不會被調用。Visual Studio 2010擴展 - 未調用的事件

所以我的問題是我做錯了什麼?

這裏是我的代碼的一小段摘錄。

// here are some attributes 
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string)] 
public sealed class VSPackage : Package { 
    EnvDTE80.DTE2 dte_; 
    EnvDTE.DocumentEvents documentEvents_; 
    EnvDTE.WindowEvents windowEvents_; 

    public VSPackage2Package() { 
    Trace.WriteLine("I am get called."); 
    } 

    protected override void Initialize() { 
    Trace.WriteLine("I am get called too."); 

    dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal. 
     GetActiveObject("VisualStudio.DTE.10.0"); 

    windowEvents_ = dte_.Events.WindowEvents; 
    documentEvents_ = dte_.Events.DocumentEvents; 

    windowEvents_.WindowCreated += 
     new EnvDTE._dispWindowEvents_WindowCreatedEventHandler(
     windowEvents_WindowCreated); 

    documentEvents_.DocumentOpened += 
     new EnvDTE._dispDocumentEvents_DocumentOpenedEventHandler(
     documentEvents__DocumentOpened); 

    Trace.WriteLine("Everything fine until here."); 
    } 

    void documentEvents__DocumentOpened(EnvDTE.Document document) { 
    Trace.WriteLine("Never called"); 
    } 

    void windowEvents_WindowCreated(EnvDTE.Window window) { 
    Trace.WriteLine("Never called"); 
    } 
} 

編輯:

我得到它的工作,尋找其他的示例代碼,我想通了,他們有時會獲得DTE對象不同。更改

dte_ = (EnvDTE80.DTE2) System.Runtime.InteropServices.Marshal. 
     GetActiveObject("VisualStudio.DTE.10.0"); 

dte_ = GetService(typeof(EnvDTE.DTE)) as EnvDTE80.DTE2; 

,現在一切都很好。

回答

0

它應該工作。

我敢肯定,如果你從一個Addin做同樣的工作。軟件包有時可能是痛苦的。

事實上,當一個包被加載時,shell(DTE)可能還沒有完全加載。嘗試註冊您的活動。

爲此,請使用OnShellPropertyChange事件和殭屍狀態來知道何時註冊。 http://social.msdn.microsoft.com/forums/en-US/vsx/thread/3097a0e1-68e3-47ea-a4ba-8511571b2487/

閱讀以下內容,我認爲它會回答你的問題。注:The GetService method is the same as calling GetGlobalService

1 ServiceProvider.GlobalProvider

在 的ServiceProvider類這種新的靜態屬性可以訪問 從任何 代碼的全球服務提供商,只要它是從 主UI叫線。此屬性爲 與 Package.GetGlobalService靜態方法 密切相關,該方法在先前的 版本的MPF中可用。與 Package.GetGlobalService的問題是,如果包尚未初始化 ,則 會失敗。這導致微妙的 訂購使用 MPF庫的代碼中的錯誤,而不初始化它們自己的 包。有時他們 只能工作,因爲另一個 包已經初始化代表他們的 全球服務提供商 。如果其他程序包已卸載,或者已移除 或可能已移至 不同版本的MPF,則該 static將不再被初始化 導致Package.GetGlobalService至 失敗。

現在,在MPF 10,你可以只要撥打任何 時間 ServiceProvider.GlobalProvider因爲你是從 UI線程調用。出於兼容性考慮,這個 機制仍然會使用由第一 包創建的 的ServiceProvider進行選址,但在情況 在沒有包裝至今還沒有 初始化,MPF 10.0現在有 能力,從獲得的全球供應商 已註冊的COM消息 過濾器。 Package.GetGlobalService()是 也連接到這個新的機制。

+0

沒有幫助,OnShellPropertyChange叫,但從來沒有與那裏提到,移動我的事件註冊反正有沒有物業成功地執行,而且事件不叫 – ConfusedSushi 2011-01-27 13:55:11

相關問題