如何从c# /创建回调.. NET通过COM转换为c++
本文关键字:COM 通过 转换 c++ NET 回调 创建 | 更新日期: 2023-09-27 18:13:15
我目前正在使用c#/。. NET库使用来自c++的COM接口。只是作为一个简单的虚构的例子来说明我目前正在做的事情:
我有c#/。. NET组件声明和导出COM接口
[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#/日志记录。网络图书馆。c#的内部结构。. NET库应该能够将日志消息发送回c++应用程序,以便使用已经存在的日志环境来编写日志消息。
<>之前[c++日志系统]<——[c#/。]网络组件)之前在这种情况下创建回调的最好方法是什么?
回调应该只接受一个简单的字符串。例如:
public interface ILogger {
void Write(string message);
}
如何在c++端实现这一点?
(同时回答:如何在c++中实现COM回调接口,从c#汇编,使用#import
和tlb
文件?)
我知道COM提供了一种事件处理模式,尽管公平地说,我从来没有弄明白过它。通过快速搜索,我找到了这个页面,它看起来像是一个很好的解释。
就我个人而言,我不会把事情弄得太复杂;我认为如果你让你的。net代码实现一个RegisterLogger(ILogger instance)
/UnregisterLogger(ILogger instance)
,并将ILogger
接口标记为双接口(即它继承自IDispatch),那么你的。net代码可以使用它来记录消息-但要确保你使用调用它的后绑定方式-例如见这里
在c++端,定义从IDispatch
继承的ILogger
接口,这样它就可以与后期绑定一起使用,并让您的c++代码调用。net RegisterLogger()
方法,传入您自己的ILogger
实现。由于使用了后期绑定,所以不需要知道c++ ILogger
接口在。net端,它只需要匹配方法签名。