如何通过COM创建从C#/.NET到C+的回调+;? 我现在使用C++的COM接口使用C.y/.NET库。作为一个简单的虚构的例子来说明我目前正在做什么:

如何通过COM创建从C#/.NET到C+的回调+;? 我现在使用C++的COM接口使用C.y/.NET库。作为一个简单的虚构的例子来说明我目前正在做什么:,c#,c++,.net,visual-c++,com,C#,C++,.net,Visual C++,Com,我有一个声明和导出COM接口的C#/.NET组件 [Guid("example-0000-0000-0000-0000000000000")] public class MyObj : IMyObj { void DoSomething(string someArgument); } 现在我导出了一个在我的C++应用程序中导入的类型库: #import "MyObj.tlb" named_guids auto_rename void someFunc() { MyObjPtr

我有一个声明和导出COM接口的C#/.NET组件

[Guid("example-0000-0000-0000-0000000000000")]
public class MyObj : IMyObj
{
    void DoSomething(string someArgument);
}
现在我导出了一个在我的C++应用程序中导入的类型库:

#import "MyObj.tlb" named_guids auto_rename

void someFunc()
{
    MyObjPtr myObj;
    myObj.CreateInstance(CLSID_MyObj);
    myObj->DoSomething(_bstr_t(L"foo"));
    // ...
}
实际上,C#/.NET组件具有许多接口和方法。它是用C++多线程方式使用的。 一切都很好,但我想为C#/.NET库启用日志记录。C.Y./.NET库的内部结构应该能够将日志消息发送回C++应用程序,以便使用已有的日志记录环境来编写日志消息。 [C++ Logging System] <--- [C#/.NET Component] 如何在C++方面实现这一点?


(同时在这里回答:)

我知道COM提供了一种事件处理模式,尽管公平地说,我从来没有想过它。一个快速的搜索把我带到了页面上,这看起来是一个很好的解释

就我个人而言,我不会让事情变得过于复杂;我认为如果您让.NET代码实现一个
RegisterLogger(ILogger实例)
/
UnregisterLogger(ILogger实例)
,并将
ILogger
接口标记为双接口(即它继承自IDispatch),然后,您的.NET代码可以使用它来记录消息,但请确保使用后期绑定的方式来调用它,例如,请参阅

<>在C++侧,定义一个继承< <代码> IDISPATTA//COD>的<代码> ILogger <代码>接口,这样它就可以 与后期绑定一起使用,并使C++代码调用.NET<代码> RealStRoGug()< <代码> > 方法,传入自己的
ILogger
实现。 由于使用了后期绑定,所以不必知道C++ <代码> ILogger < /C>接口。
.NET方面,只需要匹配方法签名。< /P>所以,我可以从<代码> ILogger < /C>接口中获得C++,并将对象指针传递给COM接口。所有权情况如何?这个C++对象是C++的对象,还是COM/C的?/ .NET部分处理这个对象?1)没有,有2个IOGGER接口,一个在.NET和一个C++中。只要它们都源于IDispatch,共享相同的方法签名,并通过后期绑定调用,每一方都可以使用自己版本的ILogger接口,同时仍然保持兼容。2)所有权与所有COM对象一样处理,实例化的一侧(C++代码)仍然是所有者,而客户端(您的.NET代码)使用I未知的AddiRf和释放来指示所有者是否可以清理实例。但是,这就变得至关重要,即接口的内存布局在两边都是相同的,即,你需要.NET代码声明接口并让C++侧导入它。仔细想想,您可能已经在代码的其他地方这样做了,这个想法还不错;)非常感谢你的回答,很抱歉我耽搁了。我会尽快尝试你的解决方案。它确实有效,但没有回答我的第二个问题。不使用ATL或MFC实现这样的COM接口并不是那么简单。但幸运的是,C#组件只对IUnknown接口感兴趣,而对IDispatch接口不感兴趣。因此,此类类的实现非常简单。
public interface ILogger {
    void Write(string message);
}