C# P/调用 : Pointer to string as error message

标签 c# .net pointers pinvoke llvm

我正在尝试使用 llvmc 作为使用 P/Invokes 的 C# 库(因为我找不到任何 .NET 绑定(bind))。

但是,我遇到了一个问题。 llvmc 使用 char** 进行错误传递。

一个例子是这样的:

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

我应该怎么做才能让这个函数在 C# 代码中使用?

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

LLVMDisposeMessage(error);

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

最佳答案

一个char**参数比较麻烦,内存管理有问题。如果将参数声明为“out string”,P/Invoke 编码器将尝试释放指针。这不太可能起作用,它需要使用 CoTaskMemAlloc() 分配字符串。

您必须将其声明为“out IntPtr”并使用 Marshal.PtrToStringAnsi() 自行编码字符串的唯一其他选项。如果 LLVMC 实际上希望您释放指针,那么除了不可插入的内存泄漏之外,这将起作用。调用它一百万次来验证这一点。由于它是一条错误消息,因此它有可能不会失效,它可能会返回一个指向字符串文字的指针。

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

关于C# P/调用 : Pointer to string as error message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3703340/

相关文章:

c# - 当我的鼠标指向 C# 中的按钮时,我想禁用其他按钮

pointers - 下面的代码如何实现接口(interface)?

c# - 序列化问题

.net - 如何使用 linq to sql 删除所有子元素?

c# - 使用 .net2 返回委托(delegate)的方法

.net - 桌面应用程序中的流体布局包装面板/VariableSizedWrapGrid?

C指针不起作用

c++ - 这是在 C++ 中使用指针的好方法吗?

c# - 如何获取 WPF 列表框中选定项的索引?

c# - Excel 2007 OLEDB 连接 : error when file contains hyperlink