C# 关于StringBuilder的互操作问题
我正在从C代码调用一个C#方法 C#方法: C方法: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
[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()的方法。