我想将包含托管代码分配的字符串字段的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);
}
由于至少有两个原因,我对此方法非常关注:
你能解释当我们在一个结构中编组字符串变量时幕后发生的事情吗?