2009-12-31 49 views
4

我想公開.NET類到COM。 做法很簡單:公開.NET類(它有事件)到COM

  • 我創造,我定義的類成員的接口應該是標記有ComVisible特性
  • 我定義這些成員的DISPID的自己
  • 我定義的接口應該是ComVisible
  • 我分配一個Guid該接口
  • 我創建一個實現了該接口
0123類

沒什麼大不了的。這一切都有效。 但是,現在我的問題是:我在這個類中有一些事件,我也想暴露給COM。
這也不算什麼大問題,但是,當我看一些例子(由MS的ComInterop工具生成的f.i.代碼)時,我發現事件是在一個單獨的接口中聲明的。 即:應該是ComVisible類,實現了2個接口:

,其限定的常規方法和屬性應該是 ComVisible
  • 定義應該是ComVisible事件另一個接口
    • 一個接口。

    現在,我的問題是:爲什麼呢?這是什麼原因?

    爲什麼在另一個接口中定義了ComVisible事件,爲什麼它們只是在包含應該是ComVisible的方法和屬性的接口中沒有定義?

    這是什麼原因?

  • 回答

    5

    這是由於COM事件的工作方式。 COM不知道委託是什麼,所以它的事件是使用回調接口實現的。希望接收事件的對象實現事件接口,將它傳遞給發送者(您的代碼),並且發送者調用它的方法。事件接口因此是分開的,因爲您不希望對您的事件感興趣的人必須實現接口的其餘部分。

    在幕後,事件接口使用「連接點」進行管理,該連接點允許收件人將其回調接口連接到發件人。此實現需要各種COM接口(IConnectionPoint,IConnectionPointContainer,IEnumConnectionPoints,IEnumConnections)和一些繁瑣的管家工作。如果你在例如本地C++,你必須關心這些接口。幸運的是,作爲.NET程序員,您不必實現它們,因爲.NET將爲您做到這一點。

    +0

    好的,我可以理解你在說什麼,但是,當我沒有通過com在另一個接口中定義它們時,爲什麼這些事件不是真正可見的? 它與ComInterfaceType屬性有關嗎? –

    +0

    它與ComSourceInterfaces屬性有關。儘管.NET可以將.NET事件轉換爲COM事件,但它仍然要求您以這種方式安排代碼,以便清楚如何在COM端進行排序。 ComSourceInterfaces屬性指示.NET,它所綁定的類可以使用給定的接口發送事件。 –

    0

    事件總是在單獨的界面上定義的。這不是由.NET實現的COM接口唯一的,而是所有的COM接口。我看到它的方式,一個接口表示方法和屬性的集合,但事件接口上的方法不會像其中任何一個那樣被調用。它們由服務器而不是客戶端調用,與正常方法的行爲不匹配。因此,通過在單獨的接口上實現這些方法,可以將服務器可以調用的函數與客戶端可以調用的方法分開。客戶端不應該能夠調用事件方法。應該要求在服務器可以調用的對象上實現接口。同樣,客戶端不應該實現已經在服務器中實現的接口。它應該調用服務器中實現的那些接口的現有實現。處理這個問題最簡單的方法是爲客戶端提供一個用於事件處理的接口,另一個由服務器實現,客戶端可以調用已經實現的功能。