2011-03-09 171 views
0

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

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

+0

您忘记向我们展示C++代码,您声明结构。 – 2011-03-09 06:43:50

+0

C++代码中的结构与C#结构中显示的相同,如struct pinvoke_call {int mynum [5]};在调用一个函数C++之后,它从那里返回这个结构变量给我想编组的C# – Ashutosh 2011-03-09 06:58:40

回答

0

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

0

在CLR中,在PInvoke调用中可以使用哪种类型的结构作为返回类型有一些限制。我不确定它支持阵列成员。另外,CLR不支持编组std:strings。你将不得不编写一些C++代码来以更友好的方式返回它(例如输出LPSTR参数)。