我可以在修饰符中使用 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 string
或 in char
。它无论哪种方式都不起作用,或者我不知道如何调用它。
所以我不得不问:这可能吗?如果是,怎么办?
不,这行不通。当您在 char*
和 string
之间编组时,编组器将分配一个新的托管字符串对象或非托管内存,并将数据复制过来。
void str_free(char* str);
的匹配 p/invoke 签名只是 void str_free(string str)
,但传递给 str_free
的 char*
指针与str_get
返回。它会指向由 CLR 而不是本机 DLL 分配的数据的不同副本,并且 free 几乎肯定会失败。
我使用导出 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 string
或 in char
。它无论哪种方式都不起作用,或者我不知道如何调用它。
所以我不得不问:这可能吗?如果是,怎么办?
不,这行不通。当您在 char*
和 string
之间编组时,编组器将分配一个新的托管字符串对象或非托管内存,并将数据复制过来。
void str_free(char* str);
的匹配 p/invoke 签名只是 void str_free(string str)
,但传递给 str_free
的 char*
指针与str_get
返回。它会指向由 CLR 而不是本机 DLL 分配的数据的不同副本,并且 free 几乎肯定会失败。