gpt4 book ai didi

c# - 什么是通过互操作/pinvoke 提供从 c++ dll 到 c# 应用程序的日志记录的方法

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:59 28 4
gpt4 key购买 nike

我有一个 C++ DLL,我有它的源代码。它当前正在记录到标准输出。

我正在通过 C# 中的 pinvoke 调用此 dll 中的方法。

我希望 C# 代码能够获取日志消息,然后将它们转发给 C# 应用程序自己的日志记录机制。

我看到了一些关于捕获标准输出的问题/答案,但我无法让它们工作。如果有人可以为此提供一个完整的 hello world 示例,那就太好了。

否则,我正在考虑更改 C++ 函数以接受某种字符串或流参数,并只用要在函数返回时读取的消息填充它。

但是,我该如何使用字符串,因为 c++ dll 需要分配内存,什么可以释放它?

有没有办法让我传入一个流并使用普通的 c# 流机制从流中读取,但在 dll 内部让它像标准输出一样正常使用?

帮助!

这个问题很接近,但我不想将它写到文件中,如果类似的东西可以捕获到内存流中那会很棒,但我没有看到内存流的等效 SafeHandle 等。 Redirect stdout+stderr on a C# Windows service

最佳答案

您可以在您的 C++ DLL 中将您的日志记录函数声明为一个函数指针,它默认为一个打印到标准输出的函数,并提供一个 P/Invoke'able 函数以将其设置为不同的回调。
您可以使用 Marshal.GetFunctionPointerForDelegate 将 C# 方法传递给此函数.

示例 (未经测试!)

C++ DLL (伪代码):

delegate void logger(char* msg);

logger log = printf;

void set_logger(logger l) {
log = l;
}

void test() {
log("Hello World!");
}

C#程序:

static extern void set_logger(IntPtr l);

static extern void test();

static Action<IntPtr> log;

static void LogToConsole(IntPtr msg)
{
Console.WriteLine(Marshal.PtrToStringAnsi(msg));
}

static void Main()
{
log = new Action<IntPtr>(LogToConsole);
set_logger(Marshal.GetFunctionPointerForDelegate(log));

test();
}

关于c# - 什么是通过互操作/pinvoke 提供从 c++ dll 到 c# 应用程序的日志记录的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3443070/

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