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

标签 c# .net clr pinvoke unmanaged

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

库 header 中的签名是这样的

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

我应该用 C# 翻译什么签名?我尝试过:

bool GetValueFromFile(string filePath, ref string result)

但是它不起作用。没有异常,返回值为true。但字符串结果仍为空。 out string resultStringBuilder result 是相同的。

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

最佳答案

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

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

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

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

关于c# - 我应该使用什么 C# 数据类型来与非托管类型 "char* &sResult"进行交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17291803/

相关文章:

c# - PostgreSQL、Linq C# 错误 'could not determine data type of parameter $1'

c# - ef core3 中 HasForeignKey 和 ForSqlServerUseSequenceHiLo 方法的替代方法是什么?

c# - 带有重音符号的 MailMessage 附件文件名

c# - 加入集合和列表在 C# Mongodb 强类型驱动程序中抛出 NotSupportedException

java - 除了 javac 或 Microsoft 的 .Net 编译器之外,还有哪些可用于 JVM 或 CLR 的编译器?

c# - Azure 生产环境中数据库迁移的最佳实践

c# - 尝试在 C# 中调用在 ArrayList 中索引的对象的方法

c# - 杀毒软件误报c#.net程序为木马

c++ - CoInitializeSecurity 在禁用 clr 选项时失败

c# - 简单的尾递归函数和循环一样高效吗?