Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?

2024-04-01

我想知道 Marshal.GetFunctionPointerForDelegate。即我想知道它如何将委托转换为非静态函数到函数指针。

它是否动态生成以某种方式附加实例的代码存根?如果是这样,这不会泄漏内存吗?也许委托在其终结器中释放了它?

看起来 System.Delegate 没有终结器,所以我对这个机制如何工作非常感兴趣。我假设函数指针需要 4 个字节,实例(32 位)需要 4 个字节,但它返回一个简单的 IntPtr。


大问题是,代表们在 CLR 中拥有与他们相关的代码冰山一角。所以只是一些提示。下载SSCLI20分布 http://www.microsoft.com/en-us/download/details.aspx?id=4917查看源码。所有相关代码都位于 clr/src/vm 子目录中。

UMEntryThunk 是封送调用的 thunk 的包装器。它由 comdelegate.cpp 中的 COMDelegate::ConvertToCallback() 创建,由 MarshalNative::GetFunctionPointerForDelegateInternal()(Marshal 方法的内部实现)调用。

指向 UMEntryThunk 的指针存储在委托对象的syncblk 中,syncblk.h,InteropSyncBlockInfo::SetUMentryThunk() 方法。

当垃圾收集器销毁委托对象时,它还会为其清理同步块并调用 ~InteropSyncBlockInfo 析构函数。它调用 UMEntryThunk::FreeUMEntryThunk() 方法来再次清理 thunk。

所以,不,不存在内存泄漏。不完全是终结器,只是正常 GC 清理的一部分。

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

Marshal.GetFunctionPointerForDelegate 如何作用于实例成员? 的相关文章

  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • FileStream 构造函数和默认缓冲区大小

    我们有一个使用 NET 4 用 C 编写的日志记录类 我想添加一个构造函数参数 该参数可以选择设置文件选项 WriteThrough http msdn microsoft com en us library system io fileo
  • VS 程序在调试模式下崩溃,但在发布模式下不崩溃?

    我正在 VS 2012 中运行以下程序来尝试 Thrust 函数查找 include cuda runtime h include device launch parameters h include
  • 为什么这个没有特殊字符的正则表达式会匹配更长的字符串?

    我正在使用此方法来尝试查找匹配项 例如 Regex Match A2 TS OIL TS OIL RegexOptions IgnoreCase Success 我得到了真实的结果 我很困惑 我认为这应该返回 false 因为模式中没有特殊
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 类的成员复制

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

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • C++ php 和静态库

    我创建了一个library a 其中包含 cpp 和 h 文件 其中包含很多类 嵌套类和方法 我想在 php 示例中包含这个静态库并尝试使用它 我想提一下 我是 php 新手 我已经在 test cpp 文件中测试了我的 libray a
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 每个数据库多个/单个 *.edmx 文件

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

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • 在简单注入器中解析具有自定义参数的类

    我正在使用以下命令创建 WPF MVVM 应用程序简易注射器作为 DI 容器 现在 当我尝试从简单注入器解析视图时遇到一些问题 因为我需要在构造时将参数传递到构造函数中 而不是在将视图注册到容器时 因此这不是适用的 简单注入器将值传递到构造

随机推荐

  • 使用什么:var 还是对象名称类型? [复制]

    这个问题在这里已经有答案了 这是我在编程时总是想知道的一个问题 当我们编写代码时该使用什么 var myFiles Directory GetFiles fullPath or string myFiles Directory GetFil
  • 对于颜色逐渐变化的多个绘图,显示 matplotlib 颜色条而不是图例

    我正在尝试制作一个简单的图 显示属于具有特定顺序的大型数据集的许多曲线 比方说图 1 n 曲线的形状随着n的增加而逐渐变化 读者能否准确地看到哪个图属于 n 的哪个值并不重要 但他们应该能够猜测 n 的数量级 因此我做了这样的事情 nVal
  • 如何在 Scala 编译器插件中生成文本形式的新源代码?

    我刚刚完成了 Java 6 编译器插件的第一个版本 它根据注释自动生成包装器 代理 适配器 委托 您可以随意称呼它 由于我正在进行 Java Scala 混合项目 因此我希望能够在 Scala 代码中使用相同的注释 并获得相同的生成代码 当
  • 如何导航到 Clion 链接库中的源代码?

    我有一个链接多个静态库的项目 例如 libModule a 当我尝试导航到模块库内的类时 Clion 仅将我带到标头声明并在那里停止导航 我希望能够深入研究模块库内函数的定义 我遇到了同样的问题 这就是我所做的 在 Clion 中 我通过在
  • Angular2 错误 TS1146:需要声明

    Angular2 新手 我正在使用 Angular io 中的种子文件 但是当我运行 npm start 时 出现 tsc 编译器错误 tsc p src src app app module ts 11 3 错误 TS1146 需要声明
  • 向几何体添加细分

    我正在尝试向球体添加细分 如下所示 http stemkoski github com Three js Subdivision Cube html http stemkoski github com Three js Subdivisio
  • Ajax POST 到控制器操作以更新视图模型,然后重新加载 div

    我仍然对 ajax 的使用感到不安 所以我的实现中存在一些漏洞 我正在尝试发布到一个控制器操作 该操作将调用存储过程来更新我的视图模型 然后重新加载将显示信息的 div 阿贾克斯帖子 order summary panel click fu
  • 在Python中使用@staticmethod和全局函数有什么区别?

    我读过了 staticmethod 和 classmethod 有什么区别 Python https stackoverflow com questions 136097 what is the difference between sta
  • iOS 6 问题将 MPMediaItem 转换为 NSData

    我试过下面的代码 void mediaItemToData MPMediaItem curItem NSURL url curItem valueForProperty MPMediaItemPropertyAssetURL AVURLAs
  • HTML 敏捷包设置

    我正在使用 Agility Pack 来解析 HTML 遵循这个问题在 C 中解析 html 的最佳方法是什么 https stackoverflow com questions 56107 what is the best way to
  • 无法在 VSCode 中调试 Typescript

    这是我的 launch json version 0 2 0 configurations type node name Launch Server request launch program workspaceRoot server s
  • Spring Boot + Gradle - 在哪里放置环境配置?

    我正在 Spring Boot 中开发一个简单的应用程序 它是在本地开发的 并且可以工作 Gradle H2 数据库的连接属性设置为application properties放置在项目的根目录下 Maven 文件夹结构 src main
  • 更改导航栏颜色

    我知道从 API 21 开始可以更改导航栏的颜色 我查看了 React Native 的文档 但找不到方法来做到这一点 我知道的唯一方法是创建一个本机模块 但这似乎不是一个好的解决方案 因为我正在使用 Expo 有内置的方法可以做到这一点吗
  • BizTalk 平面文件架构 - 如何接受 LF 或 CRLF 作为行分隔符

    我们的客户向我们发送一个平面文件作为输入 然后我们将其转换为 XML 文件 然后发送到目标系统 平面文件由多行组成 每行由 LF 或 CRLF 分隔 如何创建平面文件架构 以便 BizTalk 可以解释每一行数据 无论该行是由 LF 0x0
  • ADODB 记录集列标题

    我正在复制ADODB Recordset数据到 Excel 文件 但它将记录集数据复制到 Excel 没有列标题 我使用的是 MS Access 2013 CompyFromRecordset命令 我的问题是 有没有办法复制RecordSe
  • 可视化二分图

    有人可以推荐一个库或代码来可视化 C 中的二分图吗 Graph 似乎不直接支持这种图 但有 一些支持解开顶点 我想创建一些像这样的图形二部图 http upload wikimedia org wikipedia commons e e8
  • 如何使用 spl_autoload() 代替 __autoload()

    根据http php net manual en language oop5 autoload php http php net manual en language oop5 autoload php神奇的功能 autoload 自 PH
  • @singleton 的行为类似于@stateless bean

    我正在开发一个应用程序 java中的企业应用程序 其中我需要由多个线程同时共享的单个实例 我使用了 singleton 当每个用户登录时 通过调用 setTeleCallersDetails 远程方法在电话呼叫者列表中设置一个值 但在某些时
  • 如何从 Hive 中的 json 字符串中提取选定的值

    我在 Hive 中运行一个简单的查询 生成以下输出 以及一些其他附加列 col1 col2 A variable1 123 variable2 456 variable3 789
  • Marshal.GetFunctionPointerForDelegate 如何作用于实例成员?

    我想知道 Marshal GetFunctionPointerForDelegate 即我想知道它如何将委托转换为非静态函数到函数指针 它是否动态生成以某种方式附加实例的代码存根 如果是这样 这不会泄漏内存吗 也许委托在其终结器中释放了它