c# - 我应该使用什么 C# 数据类型来与非托管类型 "char* &sResult"交互

标签 c# .net clr pinvoke unmanaged

我正在编写 C# 代码,并且有一段代码需要调用非托管 C++ 库。

库头的签名是这样的

bool GetValueFromFile(char* sPathToFile, char* &sResult);

我应该用 C# 翻译什么签名?我试过:

bool GetValueFromFile(string filePath, ref string result)

但它不起作用。无一异常(exception),返回值为真。但字符串结果保持为空。 out string resultStringBuilder result 也是一样。

我使用 Marshal.GetDelegateForFunctionPointer 获取函数指针作为委托(delegate)。

最佳答案

您可以像处理指向指针的指针一样处理对指针的引用,至少就 P/Invoke 而言是这样。

我认为您可能需要为 sResult 参数使用 IntPtr,同时使用 Marshal.PtrToStringAnsi()Marshal.PtrToStringAuto() , 但如果不知道 C/C++ 函数是否分配了字符串内存,就很难说了。

如果有效,您可能仍需要使用 Marshal.FreeCoTaskMem() 释放内存( 获取字符串之后)或 Marshal.FreeHGlobal() ,但是如果不知道 C/C++ 函数的作用,就不可能确定这一点。

注意:如果使用 IntPtr 获取输出值,您将需要使用 out resultref result

关于c# - 我应该使用什么 C# 数据类型来与非托管类型 "char* &sResult"交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291803/

相关文章:

c# - 为什么 Main 方法是私有(private)的?

c# - .net clr方法表结构

garbage-collection - 垃圾收集器如何知道堆栈帧上的引用?

c# - 获取相对路径的绝对路径

c# - AluminumLua 定义 lua 函数

c# - Excel 电子表格中缺少列

.net - 使用 .Net 使用 XmlSerializer 有什么限制(如果有的话)?

c# - 在 C# 中将类成员引用为枚举

c# - 分析期间出现未知函数 CoUninitializeE

c# - Sql server 2005 Express Edition中的数据抓取技巧