2

我有一个从 VB6 程序中使用的 COM Callable Wrapper,但除非注册 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)] 属性。我认为这不是问题,因为我确实在注册事物时收到了事件,但我们会看到......

4

3 回答 3

1

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

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

于 2009-01-15T08:44:07.530 回答
1

我有同样的问题,并想出了如何解决它。

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

我得到了一个 C# 编写的 COM 服务器来使用来自 VB6 的事件,即使是免注册的 COM。

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

于 2009-11-06T21:37:39.270 回答
1

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

于 2010-03-12T17:11:21.593 回答