繁体   English   中英

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

[英]What C# datatype should I use to interface with unmanaged type “char* &sResult”

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

库标题中的签名是这样的

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

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

bool GetValueFromFile(string filePath, ref string result)

但这行不通。 没有异常,返回值为true。 但是字符串结果保持为空。 out string resultStringBuilder result

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

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

我认为您可能需要将IntPtrMarshal.PtrToStringAnsi()Marshal.PtrToStringAuto()一起用于sResult参数,但是如果不知道C / C ++函数是否分配了字符串内存还是很难说这有点困难。不。

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

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

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

bool GetValueFromFile(string filePath, out IntPtr result);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM