如何解决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调用。 这会导致内存泄漏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。