C++ 中的马歇尔数组C# 结构体中的结构体

发布于 2024-10-20 17:48:41 字数 948 浏览 3 评论 0原文

我有一个在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最近可好 2024-10-27 17:48:41

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).

攒眉千度 2024-10-27 17:48:41

很长一段时间后,我对此表示抱歉,因为我几乎忘记了,我找到了解决方案。我从 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...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文