C# 当我们在结构中封送字符串变量时,在幕后会发生什么?
我希望将包含托管代码分配的字符串字段的结构传递给非托管代码,将数据写入字符串字段,然后将结构返回给C#应用程序 不幸的是,我不能使用StringBuilder,因为它不可能封送包含StringBuilder字段的结构 以下是我提出的快速解决方案: 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
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);
}