我有一个在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说
答案 0 :(得分:0)
CLR中存在一些限制,可以在PInvoke调用中将哪种结构用作返回类型。我不确定它是否支持数组成员。
此外,CLR不支持编组std:字符串。您将不得不编写一些C ++代码以更友好的CLR方式返回(例如输出LPSTR参数)。
答案 1 :(得分:0)