C++ 中的马歇尔数组C# 结构体中的结构体
我有一个在 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 未处理的异常一样。方法的类型签名与 PInvoke 不兼容。我尝试通过其他论坛帖子解决该问题,但没有得到结果。
C++ 代码中的结构与 C# 结构中显示的结构相同,例如
struct pinvoke_call
{
int mynum[5]
};
调用函数 C++ 后,它会将此结构变量从那里返回到我想要封送的 C#
感谢您的回复, 阿舒托什
I am having a struct defined in C++ which contains int and std::string arrays which is a native C++ code (dll). I have used following method to get it in 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();
}
the code compiles well.
when i call this static method and get return value of struct from C++ and assign to another struct object in C# like
input = PInvokeData.TestPInvoke();
i get exception of MarshalDirectiveException was unhandeled. Method's type signature is not PInvoke compatible. I tryed to solve the problem via other forum threads, but i did not get the result.
the struct in C++ code is same as there shown for C# struct like
struct pinvoke_call
{
int mynum[5]
};
After calling a function C++ it returns this structure variable from there to C# which i want to marshal
Thanks for reply,
Ashutosh
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
CLR 中对于何种类型的结构可以用作 PInvoke 调用中的返回类型有一些限制。我不确定它是否支持数组成员。
此外,CLR 不支持封送 std:string。您必须编写一些 C++ 代码才能以更 CLR 友好的方式返回该值(例如输出 LPSTR 参数)。
There are some restrictions in the CLR in what kind of structs may be used as a return type in a PInvoke call. I'm not sure it supports array members.
Also, the CLR does not support marshaling std:strings. You'll have to write some C++ code to return that in a more CLR-friendly way (such as an output LPSTR parameter).
很长一段时间后,我对此表示抱歉,因为我几乎忘记了,我找到了解决方案。我从 C++ 函数 TestPInvoke() 返回结构指针,然后使用 IntPtr 接收该指针作为 void 指针,然后使用 Marshal.PtrToStruct() 函数将其映射到 C# 结构。谢谢大家的支持...
after long time i m replying sorry for that, since i almost forgot, i got solution for this. I returned struct pointer from C++ function TestPInvoke() and then used IntPtr to receive that pointer as void pointer and then used Marshal.PtrToStruct() function to map it into C# struct. Thanks for all your support guys...