在传递给非托管代码之前固定可更新结构?

2024-01-02

我使用一些旧的 API,需要将结构指针传递给异步运行的非托管代码。

换句话说,在我将结构体指针传递给非托管代码之后,非托管代码复制该指针并立即返回。非托管代码可以在后台的另一个线程中访问该结构。我无法控制在另一个线程或线程本身中运行的非托管代码。

固定的 { } 语句不能用于固定,因为它不是为异步非托管固定而设计的。

GCHandle 只能固定引用,因此必须对结构进行装箱才能使用 GCHandle。我尝试过,它有效。它的主要问题是你无法更新结构来自托管代码。要更新结构,首先我们需要将其拆箱,然后更新,然后再次装箱,但是...哎呀...再次装箱?!?这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码......在我的中不适用案件。

如何在没有固定 { } 语句的情况下将结构固定在内存中,以便我可以更新它来自托管代码不改变它的指针?

Thanks.

Edit:

只是想...有没有办法固定包含该结构的父对象,然后获取该结构的指针struct而不是容器对象?


在这种情况下使用固定内存并不是一个好主意,因为结构体的内存需要长期有效。 GCHandle.Alloc() 会将结构装箱并将其存储在堆上。当它被固定时,对于垃圾收集者来说将是一个长期的负担,因为它需要不断地寻找绕过路上岩石的方法。

简单的解决方案是在非托管内存中为结构分配内存。使用 Marshal.SizeOf() 获取结构的大小,并使用 Marshal.AllocCoTaskMem() 分配内存。这将为您提供需要传递给非托管代码的指针。使用 Marshal.StructureToPtr() 初始化内存。并使用 PtrToStructure() 读取由非托管代码写入的结构的更新。

如果您经常这样做,您将不断复制该结构。这可能会很昂贵,具体取决于结构的大小。为了避免这种情况,请使用不安全的指针直接访问非托管内存。一些基本语法:

using System;
using System.Runtime.InteropServices;

class Program {
  unsafe static void Main(string[] args) {
    int len = Marshal.SizeOf(typeof(Test));
    IntPtr mem = Marshal.AllocCoTaskMem(len);
    Test* ptr = (Test*)mem;
    ptr->member1 = 42;
    // call method
    //..
    int value = ptr->member1;
    Marshal.FreeCoTaskMem(mem);
  }
  public struct Test {
    public int member1;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在传递给非托管代码之前固定可更新结构? 的相关文章

  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 打印“X”个字符数与“X”字符串长度的所有可能组合(暴力破解)

    我正在尝试编写一个单词组合生成器 我的意思是打印 X 个字符数与 X 字符串长度的所有可能组合 首先 我需要说的是 我在 StackOverFlow 中看到了一个关于这个问题的问题 其中有很多单词生成器的答案来执行此操作 在不同的语言上 但
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多

随机推荐

  • 使用 video.js 包装器启用 YouTube 播放

    好的 所以我正在尝试使用 video js 项目包装 换肤 YouTube 视频 以实现与我网站上其他视频类似的外观和感觉 现在根据您可以看到的文档here https github com videojs video js blob ma
  • Django 1.3 日志记录:未记录 500 个错误

    我正在努力让 django request 记录器按照广告宣传的方式工作 500 个错误似乎不会传播到附加到它的处理程序 在每个新项目的默认日志记录配置中 注释表示 此配置执行的日志记录是针对每个 HTTP 500 错误向站点管理员发送电子
  • phpDoc 表示法指定返回类型与参数类型相同

    想象一下以下假设的类结构 在所有 PHPdoc 提示都正确设置的情况下 这并不是一个非常罕见的场景 class BaseFilter base methods class TextFilter extends BaseFilter publ
  • 如何使用git将本地存储库复制到远程服务器?

    我正在尝试使用 git 在远程服务器中部署本地代码 这就是我所做的local文件夹我的网站 git init git add git commit m Initial commit 然后 在我的网络服务器 mkdir public html
  • jQuery 选择具有特定标题的表格单元格

    我有一个带有 标题 的表 该表使用常规 tr 标签 不是 th 我需要找到标题 Col2 然后为 Col2 下的每个单元格添加一个锚点 我可以 td contains Col2 查找标题 但数据行也可能有 Col2 我如何仅搜索第一行 然后
  • 将 robomongo 连接到 mongoDB docker 容器

    我正在运行一个NodeJS应用程序与docker 撰写 https docs docker com compose 一切正常 我可以通过连接到容器内的 Mongo 来查看所有数据 但是当我连接到机器人蒙戈 https robomongo o
  • 在 `Thread.setDefaultUncaughtExceptionHandler` 中显示一个对话框

    当我的 Android 应用程序抛出异常时 我想显示一个自定义对话框来告诉用户发生了错误 所以我使用Thread setDefaultUncaughtExceptionHandler设置全局异常处理程序 public class MyApp
  • 元素固定到视口但位于容器内

    我正在尝试建立一个网站 其侧面板位于右侧 主要内容位于左侧 主要内容已经存在并且相当复杂 侧面板是新添加的 并不总是可见 主要内容的 响应能力 应该根据侧面板是否处于活动状态而表现不同 例如 当没有侧面板时 主要内容需要从 3 列布局切换到
  • 服务器上的 Google App 脚本请求验证

    我正在开发一个add on对于 Google 文档 我想做POST request到我的网络服务器add on 我已经这样做了 但是我应该如何在服务器端验证请求是否来自我的add on仅有的 有没有csrf就像机制中Google App S
  • Rplotly版本4.5.2散点图图例气泡大小设置

    我在 R 中使用plotly 4 5 2 我创建了一个散点图 其大小取决于变量 问题是这些大小也反映在图例中 这使得它们难以阅读 我希望我的图表保持不变 唯一的例外是图例中气泡的大小 这些气泡可以设置为全部相同大小 也可以缩放为较小的大小
  • 在 VB.NET 中将文件上传到 Google 驱动器 - 搜索工作代码

    我想使用 vb net 将 txt 文件上传到我的谷歌驱动器 我搜索了大约 2 个小时 发现了这个使用 VB NET Form 上传和下载到 Google Drive https stackoverflow com questions 15
  • R:对所有变量重复线性回归并将结果保存在新的数据框中

    我有一个名为 dat 的数据框 其中包含 10 个数值变量 var1 var2 var3 var4 var5 var 10 每个变量都有多个观察结果 dat var1 var2 var3 var4 var5 var6 var7 var8 v
  • 如何将实时聊天消息存储到数据库中?

    我在用mysqldb目前 对于我的数据库 我需要集成实时消息传递功能 这chat demo龙卷风提供does not实现一个数据库 而blog does 该消息服务将来也将兼作电子邮件 就像 Facebook 消息服务的工作原理一样 聊天平
  • GMOCK - 当返回类型为 void 时如何修改方法参数

    我有一个类 它接受指向另一个类的指针 并有一个方法 read class B public void read char str class A public A B bobj b bobj B b void read char str 我
  • t-sql获取2个日期之间的所有日期[重复]

    这个问题在这里已经有答案了 可能的重复 获取日期范围内的日期 https stackoverflow com questions 271595 getting dates between a range of dates 假设我有 2 个日
  • 如何检查变量是数组还是对象?

    为了反序列化 json 对象 我必须定义一个父类 其中包含子类的一个对象或对象数组 如果检索到对象 则它必须是一个对象 如果从 json 检索数组 则它必须是对象数组 JSON 数组对象 y x data 28 data 56 data 8
  • C++ 十六进制字符串到无符号整数[重复]

    这个问题在这里已经有答案了 可能的重复 C 将十六进制字符串转换为有符号整数 https stackoverflow com questions 1070497 c convert hex string to signed integer
  • IE 浏览器缓存和 jQuery 表单插件

    就像我之前的许多迷失的灵魂一样 我在 Ajax 表单提交和 IE 浏览器缓存的蛇坑中挣扎 我正在尝试使用 jQuery 表单插件编写一个简单的脚本来 Ajaxify Wordpress 评论 它在 Firefox Chrome Safari
  • 如何使用php从目录中删除文件

    从标题中您可以看到我正在寻找一种从不同目录中删除文件的方法 我在这个主题上能找到的就是 unlink 但是从我在文档中读到的内容以及测试该函数来看 它会从您放入的代码中删除文件名 让我觉得这与关闭文件非常相似 我想做的实际上是使用代码删除文
  • 在传递给非托管代码之前固定可更新结构?

    我使用一些旧的 API 需要将结构指针传递给异步运行的非托管代码 换句话说 在我将结构体指针传递给非托管代码之后 非托管代码复制该指针并立即返回 非托管代码可以在后台的另一个线程中访问该结构 我无法控制在另一个线程或线程本身中运行的非托管代