c++cli-从c#中的myStruct生成IntPtr,但c++dll应为myStruct*,而不是IntPtr

本文关键字:IntPtr myStruct 应为 c++dll 生成 c++cli- 中的 | 更新日期: 2023-09-27 17:59:38

在我的c#main中,我做了

        myStruct ret_vals;
        IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(ret_vals));
        Marshal.StructureToPtr(ret_vals, ptr, false);

MyStruct中有一个指向另一个结构的指针。根据Intellisense(编译错误),我的C++dll函数需要一个指向MyStruct的指针,而不是IntPtr。以下内容不会编译

       DoAT.atClass1 cl = new DoAT.atClass1();
      cl.read_file( ptr);

顺便说一句,我的c++函数被声明为

    public ref class atClass1
{
    public:
          int read_file(MyStruct & ret_vals)    ;
};

非常感谢您的建议。

c++cli-从c#中的myStruct生成IntPtr,但c++dll应为myStruct*,而不是IntPtr

在C++/CLI中使用引用时,不应该像在常规C++中那样使用&,而应该使用%。这意味着您必须将C++/CLI函数定义为:

public ref class atClass1
{
public:
    int read_file(MyStruct % ret_vals);
};

这样,您就可以使用.NET引用参数调用您的函数:

DoAT.atClass1 cl = new DoAT.atClass1();
cl.read_file(ref ret_vals);

不需要Marshal类!