|
1
83
您必须将其作为IntPtr返回。返回一个系统。PInvoke函数的字符串类型需要非常小心。CLR必须将内存从本机表示转移到托管表示。这是一个简单且可预测的操作。
然而,问题在于如何处理从返回的本机内存
因此,它将封送字符串,然后调用
为了在这里获得正确的语义,您必须直接返回一个IntPtr。然后使用Marshal。PtrToString*,以获取托管字符串值。您可能仍然需要释放本机内存,但这取决于foo的实现。 |
|
|
2
30
你可以使用元帅。PtrToStringAuto方法。
|
|
|
3
1
目前的答案并不完整,所以我只想在一个地方发布完整的解决方案。返回IntPtr而不是字符串根本不能解决任何问题,因为您仍然需要释放C脚本中分配的本机内存。最好的解决方案是在托管端分配字节缓冲区,并将内存传递给C脚本,该脚本将字符串写入该缓冲区,而根本不分配内存。 从C返回字符串的过程如下:
C#代码:
使用StringBuilder在C#端管理内存分配/释放有一种更简单的方法:
有一个 good topic 解释了从C/C++代码返回字符串的不同方法。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |