我正在编写 C# 代码,并且有一个代码需要调用非托管 C++ 库。
库 header 中的签名是这样的
bool GetValueFromFile(char* sPathToFile, char* &sResult);
我应该用 C# 翻译什么签名?我尝试过:
bool GetValueFromFile(string filePath, ref string result)
但是它不起作用。没有异常,返回值为true。但字符串结果仍为空。 out string result
或 StringBuilder result
是相同的。
我使用 Marshal.GetDelegateForFunctionPointer 来获取函数指针作为委托(delegate)。
最佳答案
您可以像处理指向指针的指针一样处理对指针的引用,至少就 P/Invoke 而言是如此。
我认为您可能需要使用 IntPtr
作为 sResult
参数,以及 Marshal.PtrToStringAnsi()
或Marshal.PtrToStringAuto()
,但是在不知道C/C++函数是否分配字符串内存的情况下,很难说。
如果它有效,您可能仍然需要使用 Marshal.FreeCoTaskMem()
释放内存(在获取字符串之后)或Marshal.FreeHGlobal()
,但是如果不知道 C/C++ 函数的作用,就不可能确定这一点。
注意:如果使用 IntPtr
获取输出值,则需要使用 out result
或 ref result
。
关于c# - 我应该使用什么 C# 数据类型来与非托管类型 "char* &sResult"进行交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291803/