gpt4 book ai didi

c# - 关于 StringBuilder 的互操作问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:27:28 26 4
gpt4 key购买 nike

我正在从 C 代码调用 C# 方法。

C# 方法:

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void p_func(StringBuilder arg);

public static void callback(StringBuilder arg)
{
Console.WriteLine(arg.ToString());
}

C 方法:

extern "C" void  c_method(p_func f)
{
char msg[4];
::strcpy(msg,"123");
char* p="123";
f(msg); // this is ok
f(p); //Error: Attempted to read or write protected memory!
}

但是,如果我在 C# 方法声明中使用 String 而不是 StringBuilder,则 f(p) 和 f(msg) 都有效。为什么?

    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void p_func(String arg);

public static void callback(String arg)
{
Console.WriteLine(arg.ToString());
}

注意事项

调用逻辑是这样的:

c_method()---->委托(delegate)p_func--->callback()

不是相反。

我检查了 callback(StringBuilder arg) 中的 arg,char *p 的Length、MaxCapacity、Capacity 都是一样的或消息[]。只有 *p 导致异常。为什么?

最佳答案

当您使用 String 作为参数类型时,CLR 不会尝试将任何更改写回 native 内存缓冲区。当您使用 StringBuilder(这是输入/输出字符串参数的正确选择)时,它会。但是由于你声明它的方式,p 指向的内存将是只读的,这就是你得到错误的原因。

关于c# - 关于 StringBuilder 的互操作问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3510644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com