我正在编写C#代码,并且有一个代码需要调用非托管C ++库。
图书馆标题中的签名就像这样
bool GetValueFromFile(char* sPathToFile, char* &sResult);
我应该在C#中翻译哪个签名?我试过了:
bool GetValueFromFile(string filePath, ref string result)
但它不起作用。没有异常,返回值为true。但字符串结果保持为null。 out string result
或StringBuilder result
也是如此。
我使用Marshal.GetDelegateForFunctionPointer将函数指针作为委托。
答案 0 :(得分:4)
你可以处理对指针的引用,就像指向指针一样,至少就P / Invoke而言。
我认为您可能需要使用IntPtr
sResult
参数以及Marshal.PtrToStringAnsi()
或Marshal.PtrToStringAuto()
,但如果不知道就有点难以说C / C ++函数是否分配字符串内存。
如果有效,您可能仍需要使用Marshal.FreeCoTaskMem()
或Marshal.FreeHGlobal()
释放内存(在获取字符串后),但是再次无法知道肯定不知道C / C ++函数是做什么的。
注意:如果使用IntPtr
获取输出值,则需要使用out result
或ref result
。
答案 1 :(得分:1)
您需要通过引用传递指针。假设sResult
从本机传递到托管,即它具有语义,这里是签名:
bool GetValueFromFile(string filePath, out IntPtr result);
一旦你调用它,你需要将它转换为字符串:
IntPtr resultPtr;
if (GetValueFromFile(filePath, out resultPtr))
string result = Marshal.PtrToStringAnsi(resultPtr);
目前尚不清楚谁负责释放本机代码分配的内存。据推测,这是在某处记录的,你已经知道如何处理这个问题。