gpt4 book ai didi

c# - 如何通过 COM 创建从 C#/.NET 到 C++ 的回调?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:53:09 24 4
gpt4 key购买 nike

我目前正在使用 C#/.NET 库,该库使用 C++ 的 COM 接口(interface)。作为一个简单的虚构示例来说明我目前正在做的事情:

我有一个声明和导出 COM 接口(interface)的 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 组件很复杂,有许多接口(interface)和方法。它以多线程方式从 C++ 中使用。

一切正常,但我想为 C#/.NET 库启用日志记录。 C#/.NET 库的内部应该能够将日志消息发送回 C++ 应用程序,以便使用那里已经存在的日志记录环境来写入日志消息。

    [C++ Logging System] <--- [C#/.NET Component]

What is the best way to create a kind of callback for this situation?

The callback should only take a simple string. E.g.:

public interface ILogger {
void Write(string message);
}

如何在C++端实现?

(同时在这里回答:How to implement COM callback interface in C++, from C# assembly, using #import and tlb file?)

最佳答案

我知道 COM 提供了一种事件处理模式,但公平地说,我始终无法理解它。快速搜索让我找到了 this页面,这看起来是一个很好的解释。

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

在C++端,定义一个继承自IDispatchILogger接口(interface),这样就可以与后期绑定(bind)一起使用,并让您的 C++ 代码调用 .NET RegisterLogger()方法,传入您自己的 ILogger 实现。由于使用了后期绑定(bind),C++ ILogger 接口(interface)不需要在.NET 端,它只需要匹配方法签名。

关于c# - 如何通过 COM 创建从 C#/.NET 到 C++ 的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24764830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com