C#:通过反射检索和使用 IntPtr*

2024-04-25

我目前正在编写一些代码,这些代码反映了从调用本机 dll 中编组回来的结构。某些结构包含指向以 null 结尾的指针数组的 IntPtr* 字段。这些领域需要特殊处理。当反映结构时,我可以识别这些字段,因为它们是由自定义属性标记的。

以下说明了我正在尝试做的事情:

public void ProcessStruct(object theStruct)
{
    foreach (FieldInfo fi in theStruct.GetType().GetFields(BindingFlags.Public |  BindingFlags.Instance))
    {
        if (fi.FieldType.IsPointer && IsNullTermArray(fi))
        {
            //Has the custom attribute, commence processing of 
            //IntPtr* pointing to null-terminated array
            ProcessIntPtr(fi.GetValue(theStruct));
        }
        else{/*..Other Processing..*/  }
    }
}
public void unsafe ProcessIntPtr(IntPtr* ptr)
{
    //Iterate over the array and process the elements
    //There are pointer operations here.
}

问题是

  fi.GetValue(theStruct)

返回一个对象,我显然无法将其直接传递给 ProcessIntPtr()。我无法更改 ProcessIntPtr() 的签名以接受对象,因为那样我将无法执行我需要的指针操作。显然,我也无法从对象转换为 IntPtr*。

有什么技术可以解决这个问题?


虽然您可能无法从 Object 转换为 IntPtr*,但可以转换为 IntPtr。记住,IntPtr*只是一个指针指针。所以你可以到达第一个指针,然后将其转换回来。

var ptr1 = (IntPtr)(fi.GetValue(theStruct));
var ptr2 = (IntPtr*)(ptr1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:通过反射检索和使用 IntPtr* 的相关文章

  • nUnit Assert.That委托并发问题

    我的代码中遇到了一些暂时的死锁 无法解决它 简单的代码 我无法创建一个简单的调用链来重现代码InvokeChangeEvent Test public async void Test sut InvokeChangeEvent foo fi
  • ServiceStack 验证并不总是触发

    因此 我尝试使用 RavenDB 和 ServiceStack 构建端到端集成测试套件 但遇到了一个非常奇怪的问题 即验证无法对某些请求运行 这真的很奇怪 我不确定我做错了什么 我正在使用 NCrunch 有时测试通过 有时失败 希望这是一
  • 如何使用C#检测IIS版本?

    如何使用C 检测IIS版本 更新 我的意思是来自 winapp 实际上该场景是开发一个自定义安装程序 想要检查已安装 IIS 的版本以调用适当的 api 在这里找到了答案 链接文本 http forums iis net p 1162404
  • 使用回溯(而不是 DFS)背后的直觉

    我正在解决单词搜索 https leetcode com problems word search description LeetCode com 上的问题 给定一个 2D 板和一个单词 查找该单词是否存在于网格中 该单词可以由顺序相邻单
  • C 程序的“编译器正确”命令

    这是关于中提到的编译步骤Linux 期刊文章 https www linuxjournal com article 6463 C 程序是使用编译的cpp cc1 as and ld该文章中的命令 我能够执行这些步骤cpp as and ld
  • 如何在cmake中添加cuda源代码的定义

    我使用的是 Visual Studio 2013 Windows 10 CMake 3 5 1 一切都可以使用标准 C 正确编译 例如 CMakeLists txt project Test add definitions D WINDOW
  • C# 字典循环增强

    我有一本包含大约 100 万个条目的字典 我不断地循环字典 public void DoAllJobs foreach KeyValuePair
  • 同步和异步 API

    我正在开发一个库 它提供一些耗时的服务 我需要每个 API 有两个版本 一个用于同步函数调用 另一个用于异步 图书馆用户应决定使用哪个版本 服务结果可能对于系统继续运行 同步调用 至关重要 可能需要在不同的工作线程中完成相同的操作 因为结果
  • 只允许在 datagridview 单元格中键入一些字符

    有没有办法只将某些字符添加到 datagridview 单元格中 像 1234567890 据我所知 您可以使用两种方法来实现此目的 第一个 我认为最好的 是使用 CellValidating 事件DataGridView并检查输入的文本是
  • 使用箭头键滚动可滚动控件

    我正在使用一个ScrollableControl在我的 C 项目中 我想知道如何将箭头键映射到垂直 水平滚动 编辑 我的图片框获得焦点 并且我设法映射滚动键 这里的问题是 当我按下箭头键时 它会滚动一次 然后失去焦点 将其交给滚动查看器旁边
  • 如何取消 NetworkStream.ReadAsync 而不关闭流

    我正在尝试使用 NetworkStream ReadAsync 读取数据 但我找不到如何取消调用后的 ReadAsync 作为背景 NetworkStream 由连接的 BluetoothClient 对象 来自 32Feet NET 蓝牙
  • BackgroundWorker 如何决定在哪个线程上运行 RunWorkerCompleted 处理程序?

    我试图弄清楚 BGW 在工作完成后如何决定运行 RunWorkerCompleted 处理程序的线程 我的初始测试使用 WinForm 应用程序 在 UI 线程上 我开始bgw1 RunWorkerAsync 然后我尝试开始bgw2 Run
  • ASP.NET MVC C#:将多个表/查询中的数据引入视图中

    好吧 我仍在掌握 ASP NET 和 MVC 框架的窍门 并将我的知识从经典的 ASP 和 VB 转换过来 所以请保持温柔 我的第一个视图 home details X 运行良好感谢之前的帮助为我指明了正确的方向 https stackov
  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 学习 WPF 会提高我的 ASP.NET 技能吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经在 Windows 窗体领域工作了很多年 而且仍然如此 我完全不熟悉 ASP NET 技术 也不熟悉其他 Web 相关技术 我曾合作过 O
  • Qt 对象的生命周期

    Qt 对象的生命周期是多少 Such as QTcpSocket socket new QTcpSocket 套接字什么时候会被销毁 我应该使用 delete socket 有什么区别吗 QTcpSocket socket 我找不到有关此的
  • 使用 MVVM 绑定 Xamarin.Forms 中的属性

    我在使用 Xamarin Forms 和 MVVM 制作游戏时遇到问题 游戏中有一艘由用户控制的潜艇 并且有水雷掉落 因此用户必须避开这些水雷 这些地雷是在运行时使用 2 个计时器生成的 因此我用 XAML 中的 CollectionVie
  • 制作一个未知大小的数组 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 中未知长度的数组 https stackoverflow com questions 599369 array of an unknown length in c sharp 我想创建一个程序 用
  • 在 C 中打印字符串的所有排列

    我正在学习回溯和递归 并且我陷入了打印字符串所有排列的算法 我用以下方法解决了它贝尔算法 http programminggeeks com bell algorithm for permutation 用于排列 但我无法理解递归方法 我在
  • 实现“计时器”的最佳方法是什么? [复制]

    这个问题在这里已经有答案了 实现计时器的最佳方法是什么 代码示例会很棒 对于这个问题 最佳 被定义为最可靠 失火次数最少 和最精确 如果我指定 15 秒的间隔 我希望每 15 秒调用一次目标方法 而不是每 10 20 秒调用一次 另一方面

随机推荐

  • 依赖注入陷阱

    有人在 www 上有一个链接列表来获取 DI 陷阱的好列表吗 我一直在尝试在 asp net webforms 应用程序中使用 DI 注入控件 发现在递归构建时 ViewState 会丢失 开发人员在应用程序中实施 IoC DI 之前需要注
  • C 语言中这个奇怪的函数指针声明是什么意思? [复制]

    这个问题在这里已经有答案了 谁能解释一下什么int foo int int 在这呢 int fooptr int int foo int int Can t understand what this does int main fooptr
  • Azure Pipelines 将 xUnit InlineData 视为一项测试而不是多项测试

    在我们的 Azure Pipelines 管道中 我们有采用 InlineData 参数的 NET Core xUnit 测试方法 测试运行程序运行所有测试方法 并在其控制台输出中正确报告每个 InlineData 实例作为测试运行 但是
  • 如何编写非默认排序规则的脚本并跳过默认排序规则的显式脚本?

    在SSMS 2008 R2中 我创建了一个表 aTest Albnian varchar 10 Dflt varchar 10 在 SSMS 表设计器中 两列都有排序规则 在 列属性 表设计器 下 我将 Albnian 列的排序规则更改为非
  • 如何从 Pylons 中的 URL 获取多个同名参数?

    因此 不幸的是 我发现自己处于需要修改现有 Pylons 应用程序以处理提供多个同名参数的 URL 的情况 像下面这样的东西 域 端口 操作 c 1 v 3 c 4 通常 参数是这样访问的 from pylons import reques
  • 为什么这个类库dll没有从app.config获取信息

    我正在开发一个自定义 HttpHandler 为此我编写了一个 C 类库并编译为 DLL 作为其中的一部分 我有一些目录位置 我不想在应用程序中硬编码 所以我尝试将其放入我之前使用过的 app config 中 在此之前 只需构建应用程序配
  • 如何检测 Google 应用内结算订单已取消或退款?

    我已经红色了很多帖子和谷歌文档 但我仍然不清楚如何判断应用内购买已退款 我小心翼翼地红了应用内结算 v3 不检测退款 https stackoverflow com questions 13861625 in app billing v3
  • joomla 中的全文查询

    如何使用 joomla 对象构建全文搜索查询 我一直在尝试 但没有成功 db JFactory getDBO query db gt getQuery true query gt select query gt from unis subj
  • 使用python opencv从zip加载图像

    我能够成功地从 zip 加载图像 with zipfile ZipFile test zip r as zfile data zfile read test jpg how to open this using imread or imde
  • 如何在fabricJS中通过鼠标选择被覆盖的对象?

    我正在尝试开发一种方法来选择分层在下面并 完全 被其他对象覆盖的对象 一种想法是选择顶部对象 然后通过doubleclick向下穿过层层 这就是我现在得到的 var canvas new fabric Canvas c fabric uti
  • Swift - NSDate - 删除部分日期

    我有一个以下格式的日期2015 02 22T20 58 16 0000 为了将其转换为 NSDate 我找到了以下解决方案 var df NSDateFormatter df dateFormat yyyy MM dd T HH mm ss
  • 数组仅添加重复值

    当我打印数组的内容时 它似乎会使用最后输入的命令覆盖每个元素 typedef struct int argc char argv 10 char myArray 80 size t size Command 内部主要 Command cmd
  • 谷歌采访:找到多边形的最大和[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 给定一个多
  • 如何在 SQL Server 中生成并手动插入唯一标识符?

    我正在尝试在表中手动创建一个新用户 但发现如果代码不抛出异常 就不可能生成 UniqueIdentifier 类型 这是我的例子 DECLARE id uniqueidentifier SET id NEWID INSERT INTO db
  • vue/vuetify 模态模式或最佳实践设计

    在我正在开发的应用程序中 我们有很多模态 每个模态包含少量数据 通常是 2 3 个字段 有时是复选框 列表等 问题是当组件关闭时如何从内部重置 销毁组件 造成这种情况的原因有两个 1 不必清除每个模式上的各个数据字段 2 当第二次打开模式时
  • Eclipse(在 Ubuntu 上)没有 jsp、html 和其他 Web 文件模板

    我使用 Synaptic Package Manager Ubuntu 9 10 安装了 Eclipse 但是 我的 Eclipse 没有任何 HTML 模板 在 新建 对话框中 或 JSP 模板 我该如何修复它 以便我在那里拥有一些 HT
  • Python根据for循环索引创建变量[重复]

    这个问题在这里已经有答案了 我正在尝试为 for 循环的每次迭代创建变量 对于范围 10 内的 i x i abc 这样我就可以得到 x1 x2 x3 x4 x10 都等于 abc 有人知道该怎么做吗 谢谢 你不应该这样做 将你的值存储在d
  • 使用 Base64 和 JSON 上传大图像

    我正在使用此功能将图像上传到服务器JSON 为此 我首先将图像转换为NSData然后到NSString using Base64 当图像不是很大时 该方法工作正常 但当我尝试上传 2Mb 图像时 它会崩溃 问题是服务器没有收到我的图像 即使
  • 使用 Appcompat v7 的抽屉式导航 - ?android:attr 标签的问题

    我在我的项目中使用操作栏和导航抽屉 使用 appcompat v7 和 v4 我已经添加了 appcompat v7 和资源 以下是我的导航抽屉列表的文本视图 直接取自位于以下位置的 Android 示例应用程序 创建抽屉式导航 http
  • C#:通过反射检索和使用 IntPtr*

    我目前正在编写一些代码 这些代码反映了从调用本机 dll 中编组回来的结构 某些结构包含指向以 null 结尾的指针数组的 IntPtr 字段 这些领域需要特殊处理 当反映结构时 我可以识别这些字段 因为它们是由自定义属性标记的 以下说明了