C#P / Invoke:指向字符串作为错误消息的指针

时间:2010-09-13 18:37:20

标签: c# .net pointers pinvoke llvm

我试图使用P / Invokes将llvmc用作C#库(因为我找不到任何.NET绑定)。

然而,我有一个问题。 llvmc使用char **进行错误传递。

一个例子是:

char* error = NULL;
LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error);

如何在C#代码中使用此功能?

编辑:example I found也提到了这个电话:

LLVMDisposeMessage(error);

我刚看到答案,并认为这可能是一个重要的细节。

2 个答案:

答案 0 :(得分:5)

char **参数很麻烦,存在内存管理问题。如果将参数声明为“out string”,则P / Invoke marshaller将尝试释放指针。这不太可行,它需要使用CoTaskMemAlloc()分配字符串。

您必须将其声明为“out IntPtr”,并使用Marshal.PtrToStringAnsi()自行编组字符串。如果LLVMC实际上希望你释放指针,那将超出不可插拔的内存泄漏。称它为一百万次来验证。由于它是一个错误消息,它有一些可能不会被打击,它可能会返回一个指向字符串文字的指针。

剩下的唯一选择是用C ++ / CLI语言编写一个包装器,这样就可以释放指针。

答案 1 :(得分:0)

看一下StringBuilder课程。或者您也可以简单地将参数声明为整数输出参数并使用Marshal.PtrToStringAnsi。