C# 当我们在结构中封送字符串变量时,在幕后会发生什么?

C# 当我们在结构中封送字符串变量时,在幕后会发生什么?,c#,c++,struct,marshalling,C#,C++,Struct,Marshalling,我希望将包含托管代码分配的字符串字段的结构传递给非托管代码,将数据写入字符串字段,然后将结构返回给C#应用程序 不幸的是,我不能使用StringBuilder,因为它不可能封送包含StringBuilder字段的结构 以下是我提出的快速解决方案: C#: 以下是呼叫代码: CustomerData data = new CustomerData(); data.firstName = new String('\0', 50); data.lastName = new String('\0', 5

我希望将包含托管代码分配的字符串字段的结构传递给非托管代码,将数据写入字符串字段,然后将结构返回给C#应用程序

不幸的是,我不能使用StringBuilder,因为它不可能封送包含StringBuilder字段的结构

以下是我提出的快速解决方案:

C#:

以下是呼叫代码:

CustomerData data = new CustomerData();
data.firstName = new String('\0', 50);
data.lastName = new String('\0', 50);

Modify(ref data);
C++:

我非常担心这种方法,因为至少有两个原因:

    我不确定传递给C++代码的缓冲区不会溢出。
  • 我不明白幕后发生了什么,字符串变量是如何编组到char*变量并返回的,以及它可能包含哪些缺点

你能解释一下当我们在结构中封送字符串变量时,在幕后会发生什么吗?

可能我遗漏了什么,但是封送的字符串缓冲区的大小是多少?它实际上是如何工作的?它是否将字符串缓冲区的内容复制到新的缓冲区中,并将其传递给C++方法?当从函数返回时,它是否将其复制回原始字符串?有什么方法可以看到内部是如何工作的吗?可能我遗漏了一些东西,但是要封送的字符串缓冲区的大小是多少?它实际上是如何工作的?它是否将字符串缓冲区的内容复制到新的缓冲区中,并将其传递给C++方法?当从函数返回时,它是否将其复制回原始字符串?有没有办法了解内部结构是如何工作的?
CustomerData data = new CustomerData();
data.firstName = new String('\0', 50);
data.lastName = new String('\0', 50);

Modify(ref data);
class CustomerData
{
public:
    char* firstName;
    char* lastName;
};

extern "C"
void __declspec(dllexport) Modify(CustomerData* data)
{
    strncpy_s(data->firstName, 50, "John", 50);
    strncpy_s(data->lastName, 50, "Doe", 50);
}