将 C 结构体移植到 C#

2023-12-12

我正在将 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;

谢谢你!


在我们讨论代表之前,我怀疑您对结构的打包是错误的。这样做是很不寻常的。仅当您找到该包时才执行此操作#pragma在C代码中。

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

The plmember 是一个由 4 个指针组成的数组。我不太确定它们包含什么,但可以肯定你可以像这样整理它:

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

这样您就可以手动干预来填充数组或读取其内容。这有可能由编组器完成,但在不知道互操作的语义的情况下,我无法说出如何做到这一点。

As for done,您应该在结构之外声明委托。像这样:

[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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C 结构体移植到 C# 的相关文章

  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大
  • 如何使用 Word Automation 获取页面范围

    如何使用办公自动化找到 Microsoft Word 中第 n 页的范围 似乎没有 getPageRange n 函数 并且不清楚它们是如何划分的 这就是您从 VBA 执行此操作的方法 转换为 Matlab COM 调用应该相当简单 Pub
  • 在客户端系统中安装后桌面应用程序无法打开

    我目前正在使用 Visual Studio 2017 和 4 6 1 net 框架 我为桌面应用程序创建了安装文件 安装程序在我的系统中完美安装并运行 问题是安装程序在其他计算机上成功安装 但应用程序无法打开 edit 在客户端系统中下载了
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • jQuery 可排序取消事件(如果无效)

    我有一个可排序的列表 在开始排序之前 我想检查该列表的所有元素是否有效 如果没有 请取消活动并保持列表不变 您可以在这里找到代码http jsfiddle net DZYW5 4 当我使用它时 事件被取消 但元素被删除 start func
  • 如何在 Helm for Kubernetes 中循环不同的模板?

    我想部署具有不同图像 端口等但具有非常相似的其他属性的多个 Pod 部署 所以我想声明一个deployment yaml文件看起来像这样 range Values types apiVersion extensions v1beta1 ki
  • 如何将这些功能组合起来而不重复呢?

    由于所有 3 个产品功能都有相同的产品列表 我如何将这些多个功能合并为一个 这样我就可以避免在这里重复 所有功能都有产品列表 只是货币不同 如何将这三个功能合二为一 有人可以建议我吗 谢谢 function ProductDataRende
  • OpenCV:删除图像的背景

    我正在使用 Opencv 和 python 来检测形状 然后裁剪它们 我已经成功地做到了这一点 但是现在我正在尝试拍摄裁剪后的图像并删除它们的背景 该图像内部有一个圆圈 周围是灰色 它可以是灰色的 甚至可以是不止一种颜色 如何删除圆形边框周
  • 将 TextView 与进度条的进度对齐

    我怎样才能对齐TextView随着水平的进展ProgressBar 我想放一个TextView就在进度位置的上方ProgressBar 进度可能会改变 另外 我想要TextView尽管文本长度可能会改变 但要保持在一行中 在包含 TextV
  • 使用C#程序启动Dll

    我有一个 C 表单应用程序 我创建了一个 Dll 现在我想使用该程序启动该 dll 我该怎么做 include
  • Tkinter 使用菜单栏命令无意递归...原因?

    我正在尝试使用Python GUI制作tkinter 我需要一个菜单 项来打开主窗口的另一个副本 我尝试执行以下代码 当我运行该程序时 它冻结了一点 然后打开了大量窗口 最后打印的错误消息如下 我有两个问题 如何完成使 新建 按钮打开新窗口
  • 如何在 Linux 无头服务器上安装 chrome 扩展

    我需要在无头服务器上安装 chrome 扩展 一种方法是使用组策略 我正在寻找其他方法来做到这一点 对于 Firefox 我只需将我的 XPI 扩展 放在配置文件目录 扩展文件夹中 Firefox 就会选择该扩展 我想知道对于 chrome
  • 如何交错两个不同长度的列表?

    我想写一个函数twolists给出的结果如下 outcome twolists w x y z print outcome w x y z outcome twolists 0 1 w x print outcome 0 w 1 x out
  • 如何在 Java 9 统一日志记录中使用带有冒号的 Windows 文件名?

    java11 Xlog gc file c max txt version 0 002s error logging Invalid decorator max txt Invalid Xlog option Xlog gc file c
  • 编写返回libc攻击,但libc加载到内存中的0x00处

    我正在为我的系统安全课程编写返回 libc 攻击的文章 首先 存在漏洞的代码 vuln c include
  • 如何访问 List 的数组元素

    我有个问题 我有一个 Java 列表 其中填充了不同的值 例如 我有 List
  • 加载数据到文件中,用逗号处理字段

    使用load data infile时如何处理带逗号的字段 我有这个查询 sql LOAD DATA LOCAL INFILE file INTO TABLE sales per pgs FIELDS TERMINATED BY LINES
  • Ruby Rack:启动和拆卸操作(东京内阁连接)

    我在 Rack 上的 Sinatra 中构建了一个非常简单的 REST 服务 它由 3 个 Tokyo Cabinet Table 数据存储提供支持 这些数据存储具有需要打开和关闭的连接 我有两个直接用 Ruby 编写的模型类 目前它们只是
  • Document.querySelector() 未显示所有元素

    我是一个新手 尝试设计相关 CSS 选择器和 JSPath 来运行我的自动化脚本 在路上 我发现这两者的返回语句是不同的 请检查下面的示例 有人可以告诉我需要在 JSPath 中进行哪些更改才能保持结果与相对 CSS 选择器相同 相对 CS
  • Bootstrap 崩溃和 ui-router

    我有问题ui router并使用引导崩溃 div class panel panel default div a href collapseOne Click me a div div class panel collapse collap
  • iOS 上的 NSXMLParser,给定 xml 文件如何使用它

    我想知道如何使用 NSXML 解析器 假设我有一个简单的 xml 文件 其中包含以下元素
  • 将 Get-Date 与日期作为字符串进行比较

    注册表包含一个键 其字符串值类似于 23 01 2015 14 58 00 使用 PowerShell 我需要比较此日期以确保它大于从返回的值 Get Date AddDays 1 但是格式不同 我无法在两者之间进行比较 也无法将 Get
  • Android ScaleAnimation 不缩放可点击区域

    我的布局结构如下 线性布局1线性布局2编辑文本 我使用 LayoutAnimationController 将 ScaleAnimation 应用于 LinearLayout1 以便层次结构中的所有视图都缩放相同的量 应用 ScaleAni
  • 将 C 结构体移植到 C#

    我正在将 C 代码移植到 C 但我有一些疑问 考虑这个结构 typedef struct uint32 t w uint32 t h uint32 t f cc uint32 t st unsigned char pl 4 int32 t