2009-01-15 41 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,这在某些情况下是必需的。