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

C#P/Invoke:指向字符串作为错误消息的指针,c#,.net,pointers,pinvoke,llvm,C#,.net,Pointers,Pinvoke,Llvm,我试图使用p/Invokes将llvmc用作C#库(因为我找不到任何.NET绑定) 然而,我有一个问题。llvmc使用字符**进行错误传递 例如: char* error = NULL; LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error); 我应该怎么做才能在C#代码中使用此函数 编辑:也提到了这个电话: LLVMDisposeMessage(error); 我只是看到了答案,并认为这可能是一个重

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

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

例如:

char* error = NULL;
LLVMVerifyModule(PointerToSomeModule, LLVMAbortProcessAction, &error);
我应该怎么做才能在C#代码中使用此函数

编辑:也提到了这个电话:

LLVMDisposeMessage(error);

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

看看这门课。或者您也可以简单地将该参数声明为整数输出参数,并使用Marshal.PtrToStringAnsi。

查看该类。或者您也可以简单地将参数声明为整数输出参数,并使用Marshal.PtrToStringAnsi。

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

唯一的另一个选项是将其声明为“out IntPtr”,并使用marshal.PtrToStringAnsi()自行封送字符串。如果LLVMC真的希望您释放指针,那么除了可拔掉的内存泄漏之外,这将是可行的。打一百万次电话来验证这一点。由于这是一条错误消息,它可能会返回一个指向字符串文本的指针,所以它很可能不会爆炸


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

字符**参数很麻烦,内存管理有问题。如果将参数声明为“out string”,则P/Invoke封送拆收器将尝试释放指针。这不太可能起作用,它需要用CoTaskMemAlloc()分配字符串

唯一的另一个选项是将其声明为“out IntPtr”,并使用marshal.PtrToStringAnsi()自行封送字符串。如果LLVMC真的希望您释放指针,那么除了可拔掉的内存泄漏之外,这将是可行的。打一百万次电话来验证这一点。由于这是一条错误消息,它可能会返回一个指向字符串文本的指针,所以它很可能不会爆炸


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

我没有答案(我这么做已经有一段时间了,从来没有用过char**),但是为了将来的参考,这个网站有很多P/Invoke签名,这些签名可能有助于您了解自己的签名:您对LLVM的P/Invoke努力是否在任何地方公开?我发现这样做似乎是徒劳的寻找相同的。谢谢@N8allan不,最后我使用了System.Reflection.Emit,对不起。现在实现.NET和LLVM互操作的唯一方法是通过P/Invoke。不久前,有人讨论过一些与Mono相关的项目中的.NET/C++互操作性,这些项目有可能简化这一点,但我好久没有听说过,所以我想它可能已经死了。我没有答案(我做了这件事已经有一段时间了,从来没有使用过char**),但是为了将来的参考,这个网站有很多P/Invoke签名,这些签名可能有助于您了解自己的签名:您对LLVM的P/Invoke努力是否在任何地方公开?我发现这样做似乎是徒劳的寻找相同的。谢谢@N8allan不,最后我使用了System.Reflection.Emit,对不起。现在实现.NET和LLVM互操作的唯一方法是通过P/Invoke。不久前,有人讨论过在一些与Mono相关的项目中的.NET/C++互操作性,它有可能简化这一点,但我很久没有听说过它了,所以我想它可能已经死了。那么调用malloc/calloc和free呢?可以使用LLVMDisposeMessage(error)(或者我看到的示例是这样说的)来处理错误消息。哇,这就是你需要的。在两者上都将参数声明为IntPtr,并使用我推荐的手动封送处理。调用malloc/calloc和free如何?可以使用LLVMDisposeMessage(error)(或者我看到的示例所说的那样)来处理错误消息。Whooptidoo,这就是您需要的。将参数声明为IntPtr,并使用我推荐的手动封送处理。