我想在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获得其连接点映射回...
因此,有关于如何做到这一点在网络上只有一个例子吗?这个东西还记录在哪里?或者我必须去我的本地图书馆挖掘那些1000页的书籍中的一本,书名中带有大的“COM”? – 2016-09-08 23:15:39