当我们在结构中编组字符串变量时,幕后会发生什么?

时间:2016-02-04 17:55:22

标签: c# c++ struct marshalling

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

不幸的是我不能使用StringBuilder,因为它不可能编组一个包含StringBuilder字段的结构。

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

C#:

[StructLayout(LayoutKind.Sequential)] 
public struct CustomerData 
{
    public string firstName;   
    public string lastName;  
    ...
    //other-fields
}

[DllImport("test.dll", CharSet = CharSet.None, CallingConvention = CallingConvention.Cdecl)]
extern public static void Modify(ref CustomerData data);

这是调用代码:

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

Modify(ref data);

C ++:

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);
}

由于至少有两个原因,我对此方法非常关注:

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

你能解释当我们在一个结构中编组字符串变量时幕后发生的事情吗?

0 个答案:

没有答案