如何使用P / Invoke将具有字符串数据的结构从C#传递到C ++

问题描述 投票:0回答:1

我正在尝试使用P Invoke将包含字符串数据的结构从C#传递到C ++。请查看下面我正在使用的代码。我可以传递该结构,但是SubData结构内部的值显示为垃圾值。

'''C ++

 struct SubData
{
public:
    int subData;            // Tape data
    char* stringData;
};

struct  IntList
{
public:
    int clsTapeData;            // Tape data
    int dataArray[10];
    SubData SubDataArray[10];


};


IntList OutFunction(TestClass* instance, IntList* data)
{
    data->dataArray[0] = 50;
    data->clsTapeData = 50;

    SubData subData;
    subData.subData = 10;
    subData.stringData = "Hai";
    data->SubDataArray[0] = subData;


    IntList retData;
    retData.clsTapeData = 15;

    return retData;
}

'''

'''C#代码

 [StructLayout(LayoutKind.Sequential, Pack =4)]
public struct IntList
        {
            public int data;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public int[] dataArray ;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
            public SubData[] SubDataArray;

        };



  [StructLayout(LayoutKind.Sequential, Pack = 1)]
        public struct SubData
        {
            public int subData;

            [MarshalAs(UnmanagedType.LPStr, SizeConst = 10)]
            public string stringData;
        };




[DllImport("CppTestApp", EntryPoint = "OutFunction", CallingConvention = CallingConvention.Cdecl)]
    public static extern TestClass.IntList OutFunction(IntPtr instance, out TestClass.IntList pclsTapeList);

'''

使用上面尝试的代码,但是我得到的是垃圾值。有人可以指出以上代码中的问题吗?

c# c++ interop pinvoke
1个回答
0
投票

您需要指定StructLayoutMSDN),以强制结构在字段中的顺序顺序如下(LayoutKind.Sequential),或使用LayoutKind.Explicit为每个字段明确指定偏移量:

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct IntList
{
    ...

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SubData
{
    ...
© www.soinside.com 2019 - 2024. All rights reserved.