【发布时间】:2020-10-01 11:35:48
【问题描述】:
我有以下问题:
我尝试从我的 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));
这导致与之前完全相同的结果。
【问题讨论】:
-
out可能会解决此问题,例如public static extern ReturnTypes get_struct_form_dll (out IntPtr server); -
out没有修复它。我得到完全相同的结果。
标签: c# c++ marshalling