c#编组尝试将结构从cpp dll返回到c#应用程序,该应用程序将分配为自身的dll

问题描述

我有以下问题:

我尝试从我的c#应用中调用此c ++函数

int get_struct_from_dll (some_struct** return_struct);

int get_struct_form_dll (some_struct** return_struct) {
     some_struct st;
     st.some_void_pointer = nullptr;
     st.some_string = "some_string";

     some_struct* st_ptr = &st;
     *return_stuct = return_struct;

return 1;
}

return_struct是双指针,因为get_struct_from_dll必须自己分配存储空间。 在不需要尺寸信息之前,它也只包含一个元素。

some_struct看起来像这样:

typedef struct {
     void        *some_void_pointer;      
     const char  *some_string;                                                                       
} some_struct;

现在在c#端:

[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Ansi)]
public struct some_struct
{
        public IntPtr instance;
        [MarshalAs(UnmanagedType.LPStr)]
        public string host;
}
        [DllImport(_dllPath)]
     
        public static extern ReturnTypes get_struct_form_dll (IntPtr server);

        IntPr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)));

        get_struct_form_dll(ptr);

        IntPtr ptrptr = Marshal.ReadintPtr(ptr);

        some_struct st= (some_struct) Marshal.PtrToStructure(ptrptr,typeof(some_struct));
        

现在的问题是,当我打印st时,它只会返回垃圾,但是不会抛出任何错误

请帮助!

我也尝试过: 我确实将c#代码更改为以下代码

    [DllImport(_dllPath)]
     
        public static extern ReturnTypes get_struct_form_dll (out IntPtr server);

        IntPr ptr;

        get_struct_form_dll(out ptr);

        some_struct st = (some_struct) Marshal.PtrToStructure(ptr,typeof(some_struct)); 

结果与以前完全相同。

解决方法

我终于找到了解决问题的方法。

解决方案是,在c ++端,返回后会自动释放内存。 这导致c#读取未分配的内存,这显然是行不通的。

因此解决方案是将c ++方面更改为以下内容:


int get_struct_form_dll (some_struct** return_struct) {

  some_struct* st = (some_struct*) malloc(sizeof(some_struct));
  
  *return_struct = st;

  return 1;
}


这可以防止在调用后删除数据。

请小心,因为目前从未释放过malloc调用。 这会导致内存泄漏。