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

时间:2011-03-09 06:39:09

标签: c# visual-c++ marshalling

我有一个在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 ++获取struct的返回值并分配给C#中的另一个struct对象

input = PInvokeData.TestPInvoke();

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

C ++代码中的结构与C#struct中显示的相同,如

struct pinvoke_call
{
    int mynum[5]
};

在调用函数C ++之后,它将此结构变量从那里返回到C#,我想编组

感谢您的回复, Ashutosh说

2 个答案:

答案 0 :(得分:0)

CLR中存在一些限制,可以在PInvoke调用中将哪种结构用作返回类型。我不确定它是否支持数组成员。

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

答案 1 :(得分:0)

很长一段时间后,我很抱歉,因为我差点忘了,我得到了解决方案。我从C ++函数TestPInvoke()返回结构指针,然后使用IntPtr将该指针作为void指针接收,然后使用Marshal.PtrToStruct()函数将其映射到C#struct。感谢所有支持人员......