我有一个COM Callable Wrapper,我正在使用VB6程序,但除非CCW已注册,否则程序不会接收COM事件。否则,CCW工作正常,只是没有事件,直到我删除程序的清单文件并使用“regasm / tlb / codebase theccw.dll”注册CCW。这是在WinXP SP3中。
可能是什么问题?
也许我的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)]属性。我认为这不是问题,因为我确实在事情登记时得到了事件,但我们会看到......
答案 0 :(得分:1)
在COM事件中没有早期约束。 .NET中的事件只是委托的一种特殊用法,而且最终只是函数调用,COM事件更多涉及。
您需要为事件注册的组件才能正常工作。
答案 1 :(得分:1)
我遇到了同样的问题,并想出了如何修复它。
使您的类派生自System.Windows.Forms.UserControl。
我已经有一个C#编写的COM服务器来使用VB6中的事件,即使是免注册的COM。
显然UserControl实现了IOleObject,这在某些情况下是必需的。
答案 2 :(得分:1)
我找到的唯一答案是,这不起作用,我必须注册CCW。