我试图使用P / Invokes将llvmc用作C#库(因为我找不到任何.NET绑定)。
然而,我有一个问题。 llvmc使用char **进行错误传递。
一个例子是:
char* error = NULL;
LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error);
如何在C#代码中使用此功能?
编辑:example I found也提到了这个电话:
LLVMDisposeMessage(error);
我刚看到答案,并认为这可能是一个重要的细节。
答案 0 :(得分:5)
char **参数很麻烦,存在内存管理问题。如果将参数声明为“out string”,则P / Invoke marshaller将尝试释放指针。这不太可行,它需要使用CoTaskMemAlloc()分配字符串。
您必须将其声明为“out IntPtr”,并使用Marshal.PtrToStringAnsi()自行编组字符串。如果LLVMC实际上希望你释放指针,那将超出不可插拔的内存泄漏。称它为一百万次来验证。由于它是一个错误消息,它有一些可能不会被打击,它可能会返回一个指向字符串文字的指针。
剩下的唯一选择是用C ++ / CLI语言编写一个包装器,这样就可以释放指针。
答案 1 :(得分:0)
看一下StringBuilder课程。或者您也可以简单地将参数声明为整数输出参数并使用Marshal.PtrToStringAnsi。