我有一个从 VB6 程序中使用的 COM 可调用包装器,但除非注册了 CCW,否则该程序不会接收 COM 事件。否则,CCW 工作正常,只是没有任何事件,直到我删除程序的 list 文件并使用“regasm/tlb/codebase theccw.dll”注册 CCW。这是 WinXP SP3 中的。
可能是什么问题?
也许我的 CCW 构建错误,无法用作“早期绑定(bind)”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 内部的公共(public)事件声明中没有 [ComVisible(true)] 属性。我不认为这是问题,因为我确实在注册时收到了事件,但我们会看到......
最佳答案
在 COM 中,事件不是早期绑定(bind)的。 .NET 中的事件只是委托(delegate)的特殊用法,并且最终只是函数调用,而 COM 事件则涉及更多。
您需要注册事件才能工作的组件。
关于c# - .Net CCW 无事件,免注册COM!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/446013/