.Net CCW没有注册免费COM的活动!

时间:2009-01-15 08:28:33

标签: c# .net com interop regfreecom

我有一个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)]属性。我认为这不是问题,因为我确实在事情登记时得到了事件,但我们会看到......

3 个答案:

答案 0 :(得分:1)

在COM事件中没有早期约束。 .NET中的事件只是委托的一种特殊用法,而且最终只是函数调用,COM事件更多涉及。

您需要为事件注册的组件才能正常工作。

答案 1 :(得分:1)

我遇到了同样的问题,并想出了如何修复它。

使您的类派生自System.Windows.Forms.UserControl。

我已经有一个C#编写的COM服务器来使用VB6中的事件,即使是免注册的COM。

显然UserControl实现了IOleObject,这在某些情况下是必需的。

答案 2 :(得分:1)

我找到的唯一答案是,这不起作用,我必须注册CCW。