我应该使用什么C#数据类型来与非托管类型“char *& sResult”进行交互

时间:2013-06-25 07:43:32

标签: c# .net clr pinvoke unmanaged

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

图书馆标题中的签名就像这样

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

我应该在C#中翻译哪个签名?我试过了:

bool GetValueFromFile(string filePath, ref string result)

但它不起作用。没有异常,返回值为true。但字符串结果保持为null。 out string resultStringBuilder result也是如此。

我使用Marshal.GetDelegateForFunctionPointer将函数指针作为委托。

2 个答案:

答案 0 :(得分:4)

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

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

如果有效,您可能仍需要使用Marshal.FreeCoTaskMem()Marshal.FreeHGlobal()释放内存(获取字符串后),但是再次无法知道肯定不知道C / C ++函数是做什么的。

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

答案 1 :(得分:1)

您需要通过引用传递指针。假设sResult从本机传递到托管,即它具有语义,这里是签名:

bool GetValueFromFile(string filePath, out IntPtr result);

一旦你调用它,你需要将它转换为字符串:

IntPtr resultPtr;
if (GetValueFromFile(filePath, out resultPtr))
    string result = Marshal.PtrToStringAnsi(resultPtr);

目前尚不清楚谁负责释放本机代码分配的内存。据推测,这是在某处记录的,你已经知道如何处理这个问题。