gpt4 book ai didi

c# - 将 C 结构移植到 C#

转载 作者:行者123 更新时间:2023-12-05 09:24:05 25 4
gpt4 key购买 nike

我正在将 C 代码移植到 C#,我有一些疑问。

考虑这个结构:

typedef struct
{
uint32_t w;
uint32_t h;
uint32_t f_cc;
uint32_t st;
unsigned char *pl[4];
int32_t strd[4];
void (*done)(void *thisobj);
void *e_cc;
uint32_t rsrvd2;
uint32_t rsrvd3;
} f_tt;

我已经这样做了,但它不起作用(可能是因为它是错误的 :-/):

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct f_tt
{
public uint w;
public uint h;
public uint f_cc;
public uint st;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public Byte[] pl;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] strd;
public delegate void done(IntPtr thisobj);
public delegate void e_cc();
public uint rsrvd2;
public uint rsrvd3;
}

有人可以告诉我如何在 C# 中执行此操作吗?

  void         (*done)(void *thisobj);
void *e_cc;

谢谢!

最佳答案

在我们讨论委托(delegate)之前,我怀疑你打包结构体的方式是错误的。这样做很不寻常。仅当您在 C 代码中找到包 #pragma 时才这样做。

e_cc 字段不是函数指针。它只是一个空指针。在 C# 中是 IntPtr

pl 成员是一个包含 4 个指针的数组。我不太确定它们包含什么,但可以肯定的是你可以像这样编码:

[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] pl;

这让您需要手动干预来填充数组或读取其内容。这可能可以由编码器完成,但在不了解互操作的语义的情况下,我不能说如何做到这一点。

至于done,您应该在结构外声明委托(delegate)。像这样:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void doneDelegate(IntPtr thisobj);

这里我假设调用约定是 cdecl,因为 C 代码中没有其他内容。

把它们放在一起你有:

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void doneFunc(IntPtr thisobj);

[StructLayout(LayoutKind.Sequential)]
public struct f_tt
{
public uint w;
public uint h;
public uint f_cc;
public uint st;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public IntPtr[] pl;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public int[] strd;
public doneDelegate done;
public IntPtr e_cc;
public uint rsrvd2;
public uint rsrvd3;
}

关于c# - 将 C 结构移植到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16065110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com