2009-01-15 97 views
1

我有一個COM Callable Wrapper,我使用VB6程序,但程序不會收到COM事件,除非CCW已註冊。否則,CCW會正常工作,除非我刪除程序的清單文件並使用「regasm/tlb/codebase theccw.dll」註冊CCW,否則不會發生任何事件。這是在WinXP SP3中。.Net CCW沒有免註冊COM的事件!

可能是什麼問題?

也許我的CCW被錯誤地用作「早期綁定」的VB6對象。以下是我的申明:

[ComVisible(false)] 
public delegate void AnEventDelegate(int arg1); 

[ 
ComVisible(true), 
GuidAttribute("XXXX-XXXX-XXXX-XXXX"), 
InterfaceType(ComInterfaceType.InterfaceIsIDispatch) 
] 
public interface IComEvents 
{ 
    void AnEvent(int arg1); 
} 

[ 
ComVisible(true), 
Guid("YYYY-YYYY-YYYY-YYYY"), 
ClassInterface(ClassInterfaceType.None), 
ComSourceInterfaces(typeof(IComEvents)) 
] 
public class TheComClass: IComContract 
{ 
    public TheComClass(){} 

    // Implicit implementation of IComContract. 
    // Implicit implementation of IComEvents. 
    // 
    // eg. public event AnEventDelegate AnEvent; 
} 

[ 
ComVisible(true), 
Guid("ZZZZ-ZZZZ-ZZZZ-ZZZZ") 
] 
public interface IComContract 
{ 
    [ComVisible(true)] 
    string AProp{ get; set; } 

    [ComVisible(true)] 
    void AMethod(); 
} 

我剛剛意識到的一件事。我在TheComClass的公共事件聲明中沒有[ComVisible(true)]屬性。我不認爲這是問題,因爲我確實在事件被註冊時得到事件,但我們會看到...

回答

1

我發現的唯一答案是這不起作用,我必須註冊CCW。

1

在COM事件中不是早期綁定的。 .NET中的事件只是委託的專門用法,最終只是函數調用,COM事件涉及更多。

您將需要註冊的事件組件才能正常工作。

+1

你知道我在哪裏可以閱讀更多關於此? – 2009-01-15 09:44:35

1

我有同樣的問題,並想出如何解決它。

使你的類派生自System.Windows.Forms.UserControl。

我已經得到了一個C#寫的COM服務器來使用來自VB6的事件,即使沒有註冊的COM。

顯然UserControl實現了IOleObject,這在某些情況下是必需的。