2009-07-06 36 views
4

我想在C#中编写一个托管库,它将充当现有C++事件接收器的事件源。我遇到的问题是,当非托管应用程序调用AtlAdvise来获取我的库的连接点映射时,它会得到错误“0x80040200”(CONNECT_E_NOCONNECTION) - 有一些有关与非托管相关的错误的MSDN文章< - >非托管通信和COM服务器中的无效连接点映射,但与托管COM服务器无关。将托管事件源连接到非托管事件接收器

我已经装了从非托管C++的作品服务器的IDL和得到了暴露,然后通过执行以下操作创建的那些相同的事件在我的代码的事件列表:

创建DLL包含接口我必须实现

[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIDispatch), Guid("xxxxxx")] 
public interface IMyInterface 
{ 
    ... 
    methods here 
    ... 

创建DLL,它具有实现该3个所需的接口

[Guid("xxxxxxx2")] 
[ComSourceInterfaces(typeof(IMyInterface), typeof(IMyOtherInterface), typeof(IMyThirdInterface))] 
public class DeviceTranslator : IDisposable, IMyInterface, IMyOtherInterface, IMyThirdInterface 
{ 

创建德勒类在管理界面

namespace myNS.Interfaces 
{ 
    public delegate void DistributeMessage([In] ref OLDMESSAGE Message); 

的命名空间阿泰和创建的事件在我的课的实际IMyInterface的

event DistributeMessage myDistributeMessage; 

我实现了事件: 公共事件DistributeMessage myDistributeMessage;

我可以在我的构造函数中放置一个断点,看到dll被正确加载,但是当这段非托管代码被调用时,我得到上面引用的错误:(pDistributeSink是一个CEventSink强制转换为IUnknown *, GUID为IID_IDistributeEvent是相同的GUID IMyInterface的)

hr = AtlAdvise(m_pUnknown, pDistributeSink, IID_IDistributeEvent, &m_dwConnectionPointCookie); 

在这一点上我完全抓我的头,不明白还有什么AtlAdvise需要从CLR获得其连接点映射回...

回答

4

所以我等了5天,每天旋转我的轮子,而无法弄清楚之前扔了她呃,现在一个小时后我发现了......去图。

这是我必须做的(非常感谢codeproject

我从传出事件接口(IMyInterface的)继承和我ClassInterface属性中定义它。我也创造了代表的命名空间来IMyInterface的是,没有命名空间中的DeviceTranslator类是在

事实证明,我需要:

  • 只在 ClassInterface属性定义了这一点,那么不要 覆盖该接口中的方法 。

  • 创建匹配IMyInterface的 的 方法签名那正是我的班 库命名空间中的代表(符合COM事件 片客户端方法,哪个)

  • 被命名 类 DeviceTranslator中创建活动完全一样的IMyInterface的 方法

这是非常W¯¯解释在我上面发布的链接中,并且是第一个让它真正沉浸在一切如何真正运行以及在哪里创建的东西的地方。

3

我相信这是正确的CodeProject上的链接:http://www.codeproject.com/KB/COM/cominterop.aspx#NetEvents

+0

因此,有关于如何做到这一点在网络上只有一个例子吗?这个东西还记录在哪里?或者我必须去我的本地图书馆挖掘那些1000页的书籍中的一本,书名中带有大的“COM”? – 2016-09-08 23:15:39