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

lui*_*bal 1 .net c# pinvoke pointers llvm

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

但是,我有一个问题.llvmc使用char**进行错误传递.

一个例子是这样的:

char* error = NULL;
LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error);
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能在C#代码中使用此函数?

编辑:我发现的例子也提到了这个电话:

LLVMDisposeMessage(error);
Run Code Online (Sandbox Code Playgroud)

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

Han*_*ant 5

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

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

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

  • 可以使用LLVMDisposeMessage(错误)(或者我看到的示例)来处置错误消息. (2认同)