C#结构中的C ++结构中的Marshall数组

我有一个在C ++中定义的结构,它包含int和std :: string数组,这是一个本地C ++代码(dll)。 我用下面的方法在C#中获取它:

public class PInvokeData
{
    [StructLayout(LayoutKind.Sequential)]        
    public struct pinvoke_call
    {
        //[MarshalAs(UnmanagedType.LPArray,SizeConst=5,SizeParamIndex=0,MarshalType="int")]
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=5)]//,SizeParamIndex =0,SafeArraySubType = VarEnum.VT_I4)]
        public int[] mynum;
    }
    [DllImport("DLL_pinvoke_base.dll")]
    public extern static pinvoke_call TestPInvoke();
}

代码编译得很好。 当我调用这个静态方法并从C ++获得结构体的返回值并将其赋值给C#中的另一个结构体对象时

input = PInvokeData.TestPInvoke();

我得到MarshalDirectiveException的例外是unhandeled。 方法的类型签名不是PInvoke兼容的。 我试图通过其他论坛主题解决问题,但我没有得到结果。

C ++代码中的结构与C#结构中所示的相同

struct pinvoke_call
{
    int mynum[5]
};

在调用一个函数C ++之后,它从那里返回这个结构变量给我想编组的C#

感谢您的回复,Ashutosh


在CLR中有一些限制,可以在PInvoke调用中使用哪种类型的结构作为返回类型。 我不确定它支持阵列成员。

此外,CLR不支持封送std:字符串。 你将不得不编写一些C ++代码来以更友好的方式返回它(例如输出LPSTR参数)。


经过很长一段时间,我对此表示歉意,因为我差点忘了,我为此解决了问题。 我从C ++函数TestPInvoke()返回结构指针,然后使用IntPtr将该指针作为void指针接收,然后使用Marshal.PtrToStruct()函数将其映射到C#结构中。 感谢所有支持人员......

链接地址: http://www.djcxy.com/p/66595.html

上一篇: Marshall array in C++ struct in C# struct

下一篇: GCC c++11 using a lot of RAM with STL bitset<UINT