2

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

库头中的签名是这样的

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

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

bool GetValueFromFile(string filePath, ref string result)

但它不起作用。也不例外,返回值为真。但是字符串结果保持为空。对于out string resultor也是一样的StringBuilder result

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

4

2 回答 2

4

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

我认为您可能需要使用 anIntPtr作为sResult参数,以及Marshal.PtrToStringAnsi()or Marshal.PtrToStringAuto(),但是在不知道 C/C++ 函数是否分配字符串内存的情况下很难说。

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

注意:如果使用 anIntPtr来获取输出值,则需要使用out resultor ref result

于 2013-06-25T07:52:13.627 回答
1

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

bool GetValueFromFile(string filePath, out IntPtr result);

调用它后,您需要将其转换为字符串:

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

目前尚不清楚谁负责释放本机代码分配的内存。大概这是在某处记录的,并且您已经知道如何处理该问题。

于 2013-06-25T12:40:54.030 回答