Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于StringBuilder的互操作问题_C#_.net_Interop_Marshalling_Managed - Fatal编程技术网

C# 关于StringBuilder的互操作问题

C# 关于StringBuilder的互操作问题,c#,.net,interop,marshalling,managed,C#,.net,Interop,Marshalling,Managed,我正在从C代码调用一个C#方法 C#方法: C方法: [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void p_func(StringBuilder arg); public static void callback(StringBuilder arg) { Console.WriteLine(arg.ToString()); } extern

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

C#方法:

C方法:

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

    public static void callback(StringBuilder arg)
    {
        Console.WriteLine(arg.ToString());
    }
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()

而不是相反


我检查了回调中的参数(StringBuilder参数),char*p或msg[]的长度、最大容量和容量都相同。只有*p会导致异常。为什么?

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

“我正在从C代码调用C#方法。”-一个问题,为什么?:)我不太了解C++,但是你在C++应用程序中定义了pH-FUNC是什么?StringBuilder作为特例进行封送…@Matthew p_func是一个委托,用于表示名为callback()的方法。