C# 对于字符串值,在libnfc上使用pinvoke时出现无效指针异常
我正在尝试使用dotnet core与raspberry pi 3上的NFC读写器进行通信 我不得不说,我使用的不同libnfc命令行工具都工作得很好(也就是说,我可以读取和轮询我的标记,这方面没有问题) 我们的想法是使用dotnet core和C#来编排libnfc库,它似乎工作正常,除非我调用的函数返回字符串,否则我会收到以下错误消息:C# 对于字符串值,在libnfc上使用pinvoke时出现无效指针异常,c#,.net-core,raspberry-pi3,pinvoke,lib-nfc,C#,.net Core,Raspberry Pi3,Pinvoke,Lib Nfc,我正在尝试使用dotnet core与raspberry pi 3上的NFC读写器进行通信 我不得不说,我使用的不同libnfc命令行工具都工作得很好(也就是说,我可以读取和轮询我的标记,这方面没有问题) 我们的想法是使用dotnet core和C#来编排libnfc库,它似乎工作正常,除非我调用的函数返回字符串,否则我会收到以下错误消息: *** Error in `./NfcTest': free(): invalid pointer: 0x6d4ebc00 *** NfcTest当然是我
*** Error in `./NfcTest': free(): invalid pointer: 0x6d4ebc00 ***
NfcTest当然是我应用程序的名称
这是pinvoke的定义
[DllImport("libnfc", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.LPStr)]
public static extern string nfc_version();
请注意,在网上查找后,我自己添加了[return]
属性,但没有对结果进行任何更改。同样的错误也会出现
libnfc中nfc_版本的代码如下:
它似乎返回了一个“常数”,没有任何形式的释放。所以我的猜测是我错误地配置了其中一个属性
另一个例子是,我称之为:
[DllImport("libnfc", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern string nfc_device_get_name(IntPtr pnd);
虽然我可以使用指针(pnd param)完美地调用其他方法(即poll),但调用此方法返回的错误与Version方法相同。两种返回字符串的方法都让我想知道问题是否不在DllImport中,但我不太确定如何解决这个问题
链接到该示例的lib代码:
任何智慧都将不胜感激。马修·沃森的评论和作者的回答都是正确的 所以我修改了pinvoke线如下:
[DllImport("libnfc", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr nfc_version();
然后我这样称呼它:
public string Version()
{
IntPtr ptr = Functions.nfc_version();
var str = Marshal.PtrToStringAuto(ptr);
return str;
}
它就像一个符咒
谢谢 读一读。您可能需要返回一个IntPtr
,然后自己将其封送到字符串中。