如何从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#汇编,使用#importtlb文件?)

如何从c# /创建回调.. NET通过COM转换为c++

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

就我个人而言,我不会把事情弄得太复杂;我认为如果你让你的。net代码实现一个RegisterLogger(ILogger instance)/UnregisterLogger(ILogger instance),并将ILogger接口标记为双接口(即它继承自IDispatch),那么你的。net代码可以使用它来记录消息-但要确保你使用调用它的后绑定方式-例如见这里

在c++端,定义从IDispatch继承的ILogger接口,这样它就可以与后期绑定一起使用,并让您的c++代码调用。net RegisterLogger()方法,传入您自己的ILogger实现。由于使用了后期绑定,所以不需要知道c++ ILogger接口在。net端,它只需要匹配方法签名。