【发布时间】:2012-06-14 04:31:26
【问题描述】:
假设这个 C 函数:
void do_something(const char* str)
它将字符串存储在某处以供以后参考。
此外,我在 C# 中有这个签名来调用这个函数:
[DllImport("NativeLib")]
static extern void do_something(string str);
现在,将字符串传递给此方法时我需要做什么:
- 我是否需要固定字符串(使用
GCHandle.Alloc())(或者编组器创建副本)? - 如果我确实需要固定它,是否传递“原始”字符串(即我传递给
GCHandle.Alloc()的字符串)?还是需要传递GCHandle.AddrOfPinnedObject()的返回值? - 在这种情况下,
string是正确的数据类型(对于do_something)吗?还是应该改用IntPtr?
【问题讨论】:
-
当你说它“将字符串存储在某处”时,你的意思是它复制了字符串,还是你的意思是它只存储了指针?这对您的问题的答案有很大的影响。如果您只是存储指针,则需要使用 GCHandle.Alloc()。否则,编组器会制作一个临时副本。
-
它直接存储点(不是副本)。
-
您应该将互操作签名中的字符串参数替换为
IntPtr或byte*。