将C++结构编组到C#

Luk*_*kas 6 c# c++

我在非托管C++中有这么简单的结构:

struct Cam
{
    char ip[16];
    char login[16];
    char pass[16];
    char name[16];
};
Run Code Online (Sandbox Code Playgroud)

和C#编组结构:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct Cam
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string ip;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string login;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string pass;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string name;
}
Run Code Online (Sandbox Code Playgroud)

当我通过函数将C#struct传递给C++ lib时

[DllImport("NVRLib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void AddCameraStruct(Cam cam);
...
Cam cam = new Cam();
cam.ip = "192.168.0.232";
cam.login = "admin";
cam.pass = "admin";
cam.name = "kekekeke";
AddCameraStruct(cam);
Run Code Online (Sandbox Code Playgroud)

并在C++中打印传递的值:

__declspec(dllexport) void AddCameraStruct(Camera cam)
{
    printf(cam.ip);
    printf("\n");
    printf(cam.login);
    printf("\n");
    printf(cam.name);
    printf("\n");
    printf(cam.pass);
    strcpy(camera[CAM_NUM].ip, cam.ip);
    strcpy(camera[CAM_NUM].login, cam.login);
    strcpy(camera[CAM_NUM].pass, cam.pass);
    strcpy(camera[CAM_NUM].name, cam.name);
    CAM_NUM++;
}
Run Code Online (Sandbox Code Playgroud)

它打印:

232
<EMPTY LINE>
192.168.0.232
n
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Jos*_*ush 2

当我从你的评论中了解更多信息后,

改变

__declspec(dllexport) void AddCameraStruct(Camera cam)
Run Code Online (Sandbox Code Playgroud)

__declspec(dllexport) void AddCameraStruct(Cam cam)
Run Code Online (Sandbox Code Playgroud)