我可以在修饰符中使用 C# 7.2 而不是 IntPtr 吗?

Can I use C# 7.2 in modifier instead of IntPtr?

我使用导出 2 个函数的本机 DLL:

int str_get(char** strPtr); // to allocate and return a string
void str_free(char* str); // to free the above string

我在 C# 中将这些函数编组为:

int str_get(out IntPtr str);
void str_free(IntPtr str);

... 然后使用 Marshal.PtrToStringAnsi 来获取字符串。这按预期工作。

我还可以将 "get" 函数编组为:

int str_get(out string str)

这样我就可以不用Marshal直接获取字符串了。不过我想不通的是在这种情况下如何调用 "free" 函数。我在想我需要以不同的方式编组它,也许在 C# 7.2 中使用 in 修饰符作为 in stringin char。它无论哪种方式都不起作用,或者我不知道如何调用它。

所以我不得不问:这可能吗?如果是,怎么办?

不,这行不通。当您在 char*string 之间编组时,编组器将分配一个新的托管字符串对象或非托管内存,并将数据复制过来。

void str_free(char* str); 的匹配 p/invoke 签名只是 void str_free(string str),但传递给 str_freechar* 指针与str_get 返回。它会指向由 CLR 而不是本机 DLL 分配的数据的不同副本,并且 free 几乎肯定会失败。