C# 对于字符串值,在libnfc上使用pinvoke时出现无效指针异常

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当然是我

我正在尝试使用dotnet core与raspberry pi 3上的NFC读写器进行通信

我不得不说,我使用的不同libnfc命令行工具都工作得很好(也就是说,我可以读取和轮询我的标记,这方面没有问题)

我们的想法是使用dotnet core和C#来编排libnfc库,它似乎工作正常,除非我调用的函数返回字符串,否则我会收到以下错误消息:

*** 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
,然后自己将其封送到字符串中。