C# 通过互操作连接COM事件源

C# 通过互操作连接COM事件源,c#,com-interop,C#,Com Interop,我试图从C#公开COM事件源。 我有以下从TLB导入的事件接口: [Guid("AAAABBBB-CCCC-DDDD-EEEEFFFFAAAA")] [InterfaceType(2)] [TypeLibType(4096)] public interface _IFooEvents { [DispId(20)] void FooEvent(int Value); // Remainder of elements omitted for brevity } 我正在尝试将此事件

我试图从C#公开COM事件源。 我有以下从TLB导入的事件接口:

[Guid("AAAABBBB-CCCC-DDDD-EEEEFFFFAAAA")]
[InterfaceType(2)]
[TypeLibType(4096)]
public interface _IFooEvents
{
   [DispId(20)]
   void FooEvent(int Value);
   // Remainder of elements omitted for brevity
}
我正在尝试将此事件接口作为源在我的应用程序中定义的
ComVisible
对象上实现:

[ComVisible(true), Guid("FFFFEEEE-DDDD-CCCC-BBBBAAAAFFFF")]
[ComSourceInterfaces("_IFooEvents")]
class FooConcrete : IFoo
{
    [ComVisible(false)]
    public delegate void FooEvent(int Value);
    // Remainder of delegates omitted for brevity.

    public event FooEvent TheFooEvent;

 }

此源由C++使用ATL ./P>实现的接收器使用。

HRESULT AdviseResult = _IDispEvent::DispEventAdvise(pUnk, IID__IFooEvents);

返回的
HRESULT
0x80131522:无法找到或加载类型

这是一个简单的TypeLoadException。如果没有托管调试器,则很难看到,因此请通过将调试器类型设置为“混合”来启用它。在COM场景中,找不到程序集是非常非常常见的。除非使用GAC,否则CLR无法找到依赖程序集。使用Fuslogvw.exe进行诊断。首选单片程序集,还应确保将“嵌入互操作类型”属性设置为True,这样就不会依赖于定义事件接口所需的互操作库。@HansPassant修改要嵌入的库解决了此问题。如果你愿意的话,就把它贴出来,我会接受的。