GCHandle.FromIntPointer 未按预期工作

2024-01-18

这是一个非常简单(完整)的程序,用于练习 GCHandle.FromIntPointer 的使用:

using System;
using System.Runtime.InteropServices;

namespace GCHandleBugTest
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] arr = new int[10];

            GCHandle handle = GCHandle.Alloc(arr, GCHandleType.Pinned);
            IntPtr pointer = handle.AddrOfPinnedObject();
            GCHandle handle2 = GCHandle.FromIntPtr(pointer);
        }
    }
}

请注意,该程序本质上是英文描述的程序的音译通过 C# 的 CLR (4e) http://shop.oreilly.com/product/0790145353665.do第 547 页。但是,运行它会导致非托管异常,例如:

Additional Information: The runtime has encountered a fatal error. The address of the error was at 0x210bc39b, on thread 0x21bc. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

我认为这可能是 .NET 4.5 中的一个错误,并且由于我没有看到任何明显错误,因此我在 Linux 上的 Mono (v2.10.8.1) 中尝试了完全相同的程序。我得到了稍微多一点的信息,但仍然令人费解的异常GCHandle value belongs to a different domain.

据我所知,handle确实与我调用的代码属于同一个 AppDomainGCHandle.FromIntPtr。但事实上,我在两个实现中都看到了异常,这让我怀疑我遗漏了一些重要的细节。这里发生了什么?


你的思维模式是错误的。 FromIntPtr() 只能转换回从 ToIntPtr() 获得的值。它们是方便的方法,特别适合在非托管代码中存储对托管对象的引用(并使其保持活动状态)。这gcroot 模板类 http://msdn.microsoft.com/en-us/library/481fa11f.aspx依赖它,在C++项目中使用。这很方便,因为非托管代码只需存储指针。

底层值(实际指针)称为“句柄”,但它实际上是指向垃圾收集器维护的表的指针。表创建extra除了垃圾收集器找到的对象之外,还包括对对象的引用。实质上允许托管对象生存,即使程序不再拥有对该对象的有效引用。

GCHandle.AddrOfPinnedObject() 返回一个完全不同的指针,它指向实际的托管对象,而不是“句柄”。 “属于不同的域”异常消息是可以理解的,因为我提到的表与 AppDomain 关联。

.NET 4.5 中的崩溃看起来非常像一个错误。它确实使用名为 MarshalNative::GCHandleInternalCheckDomain() 的内部 CLR 函数执行测试。 CLR 的 v2 版本引发 ArgumentException 并显示消息文本“无法跨 AppDomains 传递 GCHandle。”。但 v4 版本在此方法内崩溃,进而生成 ExecutionEngineException。这确实not看起来是故意的。

反馈报告提交于连接.microsoft.com https://connect.microsoft.com/VisualStudio/feedback/details/791096/gchandle-fromintptr-argument-value-check-does-not-work

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

GCHandle.FromIntPointer 未按预期工作 的相关文章

  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 C# 控制台应用程序中将修饰符(ctrl、alt、shift)按键捕获为单个按键?

    Console ReadKey 仅在按下 正常 键时捕获输入 然后将修饰符 如果有 附加为键信息的一部分 如何将单个修饰键注册为输入 提供了一种解决方案这个链接 https blogs msdn microsoft com toub 200
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 类的成员复制

    在学习 复制成员 概念时 书中给出了如下说法 此外 如果非静态成员是引用 const 或没有复制赋值的用户定义类型 则无法生成默认赋值 我不太明白这个声明到底想传达什么 或者说这个说法指的是哪一种场景 谢谢 该语句与编译器自动为您编写的类
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 如何在 QTabWidget Qt 中展开选项卡

    我有一个QTabWidget像这个 但我想展开选项卡以 填充 整个小部件宽度 如下所示 我怎样才能做到这一点 我在用Qt 5 3 2 and Qt 创建者 3 2 1 Update 我尝试使用setExpanding功能 ui gt myT
  • 单例模式和 std::unique_ptr

    std unique ptr唯一地控制它指向的对象 因此不使用引用计数 单例确保利用引用计数只能创建一个对象 那么会std unique ptr与单例执行相同 单例确保只有一个实例属于一种类型 A unique ptr确保只有一个智能指针到
  • 如何从文本文件读取整数到数组

    这就是我想做的 我对此有些不满 但我希望你能容忍我 这对我来说是一个非常新的概念 1 在我的程序中 我希望创建一个包含 50 个整数的数组来保存来自文件的数据 我的程序必须获取用户的文档文件夹的路径 2 文件的名称为 grades txt
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 每个租户的唯一用户名和电子邮件

    我正在使用以下代码编写多租户应用程序ASP NET Core 2 1 我想覆盖默认的与用户创建相关的验证机制 目前我无法创建多个具有相同的用户UserName My ApplicationUser模型有一个名为TenantID 我想要实现的
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 内存屏障和 TLB

    内存屏障保证数据缓存的一致性 但是 它能保证TLB的一致性吗 我发现一个问题 在线程之间传递 MappedByteBuffer 时 JVM java 7 update 1 有时会因内存错误 SIGBUS SIGSEG 而崩溃 e g fin
  • javascript过滤数组多个条件

    我想简化对象数组 假设我有以下数组 var users name John email email protected cdn cgi l email protection age 25 address USA name Tom email
  • 访问查询错误(“from 子句中的语法错误”)

    consulta3 SELECT FROM Dept INNER JOIN Userinfo INNER JOIN Checkinout on Dept DeptName departamento where Dept Deptid Use
  • 修复 Google Chrome 上的蓝线

    我有以下 HTML div div aga ad gdas ga gs ds da dgs sd ds dg gdgsdgwa div div And CSS a b position absolute height 10px font s
  • 当进程尚未完成时 GetExitCodeProcess() 返回 1

    如果我创建一个进程和两个管道集 并且该进程在某个时间需要一些用户输入 则GetExitCodeProcess 从 Windows C API 总是返回1 作为示例 您可以使用 Windowstime命令 这将返回 The current t
  • 填充数据框中缺失的组合

    我的示例数据集 df lt data frame REGION c REGION A REGION A REGION B CATEGORY c A B B VALUE1 c 2 3 4 VALUE2 c 1 2 3 Result REGIO
  • Magento URL重写管理保留GET参数[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我经常使用 Magneto 的 URL 重写管理来重定向一堆页面 然而 URL 带有附属信息 即www mysite com aff 12
  • 移动网站 - 根本不滚动

    我到处搜索 我的网站没有固定的高度 没有固定的展示位置 它显示了我想要的视口 但仅此而已 它不会滚动或显示任何其他内容 我缺少什么 我已经尝试了各种溢出选项 但似乎没有任何效果 我会做以下 我首先会暂时禁用 删除样式表 以确保一切都像纯 h
  • Azure AD 身份验证中的访问令牌验证

    我能够在 Azure AD 身份验证中请求令牌 但问题是每当我更改 access token 中的最后一个字符时 它仍然在我的 API 中成功请求 我只是按照这个https mehmetkut com 2017 05 protect asp
  • 多个复选框值将显示在文本框中

    这是我的代码 div align center b A b div
  • 核心数据如何更新一条记录?

    我有一些对象是与对象用户一对一相关的图像 例如 Image User 现在我想做 当用户登录时 我向每个图像显示一个按钮以添加到收藏夹 当我单击此按钮时运行此代码 User user UserController sharedInstanc
  • ServiceStack:动态添加路由

    我还没有尝试过这个 但我希望每个模块 Silverlight 注册自己的路由 而不是将其添加到应用程序启动中 可以在应用程序启动后将路由添加到 AppHost 还是必须在配置步骤中立即注册它们 我正在考虑在启动时扫描所有程序集 并向AppH
  • 如何告诉 Grunt 在构建任务中不要缩小或连接 js 文件?

    我刚刚使用 Yeoman 搭建了一个 Angular 应用程序 我注意到build默认情况下 task 会执行几件事 包括缩小和连接 js 文件 我想要一个更简单的构建任务 不执行任何缩小或串联 而是只执行以下两件事 将我的 scss 编译
  • 尝试在 AWS Elastic Beanstalk Web 服务器(单实例)PHP 上配置 SSL 时出现问题

    我正在将客户的网站迁移到 AWS 我已配置所有内容并正常工作 但客户希望能够在该网站上接受付款 我遵循了几个关于如何使用 elastic beanstalk 让 SSL 工作的指南 目前 我已将其设置为使用源包 并在 ebextension
  • API网关上的数据聚合

    我正在研究微服务架构 我想聚合来自两个微服务的数据 例如 Frontend 调用 API Gateway API Gateway 调用两个微服务 Customer 和 Order 微服务 客户微服务返回客户详细信息 订单微服务返回客户订购的
  • perl排序问题

    我有一些巨大的日志文件需要排序 所有条目都有一个 32 位十六进制数字 这是我想要使用的排序键 有些条目是单行的 例如 bla bla bla 0x97860afa bla bla 其他的有点复杂 从上面相同类型的行开始 扩展到用大括号标记
  • Cesium:矩形实体上的自定义材质

    我正在尝试添加一个具有多种不同属性的实体 例如材质 主要是 alpha 和旋转 矩形图形已覆盖旋转 并且在我设置材质来表示纹理时起作用 viewer entities add name Site Layer rectangle coordi
  • 使用 OneToMany 的 Spring Data Projection 返回太多结果

    我有一个具有一对多关系 ContactInfo 的 JPA 实体 Person Entity public class Person Id GeneratedValue private Integer id private String n
  • Android 在 NativeScript 中不显示字体图标

    我正在尝试将 Ionicons 与 Android 和 NativeScript 一起使用 我已经包括了ionicon ttf文件和我的集合font family Ionicons 它可以在 iOS 上运行 但不能在 Android 上运行
  • GCHandle.FromIntPointer 未按预期工作

    这是一个非常简单 完整 的程序 用于练习 GCHandle FromIntPointer 的使用 using System using System Runtime InteropServices namespace GCHandleBug