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