是否可以从 .NET 中的动态方法调用内部方法?

2024-02-10

我正在尝试从动态生成的方法调用内部方法。 il代码很简单:ldarg_0、callvirt、ret。

执行该方法失败,并出现 TypeLoadException,表示无法加载定义内部方法的类型。

当我想到这一点时,这似乎是合乎逻辑的,因为动态方法宿主程序集不是该方法的声明类型程序集的友元。

但是,我预计动态方法仍然可以工作,就像 Delegate.CreateDelegate 一样。毕竟我确实拿到了内部方法的MethodInfo,所以权限障碍已经过去了。

无论如何,问题是“是否可以从动态生成的方法调用内部方法?”

Thanks.

EDIT:

这是演示该问题的简单代码示例:

using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Emit;

namespace A
{
  internal class Data
  {
    internal string String { get; set; }
  }

  public static class Program
  {
    public static void Main()
    {
      Expression<Func<Data, string>> expr = x => x.String;
      var getterInfo = ((PropertyInfo)((MemberExpression)expr.Body).Member).GetGetMethod(true);
      var getter1 = (Func<Data, string>)Delegate.CreateDelegate(typeof(Func<Data, string>), getterInfo);
      var dm = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) });
      var gen = dm.GetILGenerator();
      gen.Emit(OpCodes.Ldarg_0);
      gen.Emit(OpCodes.Castclass, typeof(Data));
      gen.Emit(OpCodes.Callvirt, getterInfo);
      gen.Emit(OpCodes.Ret);
      var getter2 = (Func<object, object>)dm.CreateDelegate(typeof(Func<object, object>));

      var data = new Data() { String = "Hello" };
      var str1 = getter1(data);
      var str2 = getter2(data);
    }
  }
}

在代码中,我创建了两个开放实例委托来访问 Data.String 实例属性:

  • 使用 Delegate.CreateDelegate 类型安全 getter1
  • 使用 DynamicMethod 键入不安全的 getter2

由 Delegate.CreateDelegate 创建的类型安全委托可以工作,而使用 DynamicMethod 创建的类型安全委托则失败并出现 TypeLoadException。

请注意,我不希望采用类型安全的方法,因为创建 getter 的上下文不是通用的。当然,我可以解决这个问题,但现在的问题是主体 - 为什么 DynamicMethod 失败而 Delegate.CreateDelegate 成功?


如果您跳过可见性检查,它将起作用。

改变这一行

var dm = new DynamicMethod(string.Empty, typeof(object), new Type[] { typeof(object) }, true);

See msdn http://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod.aspx:(特别是包含所有规则的表格。)

这是来自构造函数的 doco。

strictedSkipVisibility 类型: System.Boolean true 跳过 JIT 对类型和成员的可见性检查 由动态的 MSIL 访问 方法,有这样的限制: 程序集的信任级别 包含这些类型和成员必须 等于或小于信托 发出的调用堆栈的级别 动态法;否则为假。

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

是否可以从 .NET 中的动态方法调用内部方法? 的相关文章

  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?

    我试图将我的表单精确定位在任务栏上方 不幸的是 我的努力受到了以下事实的阻碍 this Height在我的表单上返回一个比实际表单 包含所有边框 标题栏等 小 10 像素的值 我正在运行带 Aero 的 Windows 7 当 Aero 关
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然
  • 使用 system.reflection 列出类字段

    我需要获取一个列表来存储类中的所有字段 值 这个班级只是一些公共的const string我在下面粘贴的变量 public class HTDB Cols public class TblCustomers public const str
  • 当视图模型类型为包含超过 4 个项目的元组时,Asp.net mvc 2 .net 4.0 出现错误

    当我在 Asp net mvc 2 net 4 0 中使用模型类型 Tuple 创建强类型视图时 当 Tuple 具有超过 4 个项目时 我会收到错误 示例1 视图类型是Tuple
  • ASP.NET MVC 的示例 MS 应用程序?

    我正在开始我的第一个 MVC 项目 并希望有一个良好的开端 我了解如何创建快速但肮脏的 MVC 应用程序的基础知识 但是 我想获得使用开发 ASP NET MVC 应用程序最佳实践的资源 文档或示例快速入门应用程序 任何帮助表示赞赏 书呆子
  • .NET Framework 中的语言互操作性(基本概念)是什么?

    我正在阅读 NET框架 https en wikipedia org wiki NET Framework维基百科的文章 第一段描述了这个框架的一般概念 它说 它包括一个大型库 并提供跨多种编程语言的语言互操作性 每种语言可以使用用其他语言
  • 使用“new()”和“.StartNew()”创建新实例有什么区别?

    来自我对问题的 回答 任务中的秒表似乎在所有任务中都是累加的 只想测量任务间隔 https stackoverflow com a 16259019 200449 创建新的项目之间可能存在哪些差异跑表 http msdn microsoft
  • 主动解决方案平台 VS 项目平台 VS 目标平台

    我希望我的应用程序是针对 x64 构建的 因为我使用的是 x64 dll 在配置管理器中 我已将 活动解决方案平台 设置为 x64 但是在项目列表中平台设置为 x86 项目属性中的 平台目标 也设置为 x86 我完全困惑有三个地方可以设置目
  • 如何将 webmethod 与 telerik 批量编辑网格一起使用

    Work on Asp net vs2012 C telerik RadGrid batch edit I put save button outside from the grid Under the save button want t
  • 添加到 .NET 任务栏中的右键单击应用程序菜单

    大多数应用程序只有 恢复 移动 调整大小 最小化 最大化和关闭 但是MS SQL提供了额外的选项 帮助 自定义视图 按照这些思路 是否可以添加到任务栏中应用程序的右键单击菜单 注 我是not指通知区域中时钟旁边的图标 这是一个更简单的ans
  • RichTextbox SelectionStart 返回错误的索引

    我需要向用户显示光标上文本的选择开始和长度 就像在 notepad exe 中一样 选择长度没有问题 因为 Richtextbox 支持带有开始和结束的选择属性 http msdn microsoft com en us library s
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 带有嵌入 Flash 视频的 PDF 示例?

    有谁知道我在哪里可以查看嵌入 Flash 视频的 PDF 示例 我知道问这个问题很愚蠢 因为你会认为任何面向技术的用户都应该能够使用谷歌找到一个 但我真的找不到 我的另一个问题是 使用 C 中的 API 将 Flash 视频嵌入 PDF 文
  • 检查 SSRS 报告自定义代码中的 Active Directory 组成员资格表单

    我正在构建 SQL Server Reporting Services SSRS 报告 查看报告的最终用户可以选择某些输入参数 在本例中为位置 用户可以选择的位置取决于 Active Directory 组成员身份 因此我尝试在自定义报告功
  • 从 RichTextBox 复制文本及其格式

    如何将 RichTextBox 中的文本及其格式复制到写字板或网络浏览器 就像复制纯文本一样 您可以使用Clipboard SetText method http msdn microsoft com en us library 6eahs
  • 标准 .NET 库是否依赖于任何非托管 DLL?

    只是出于好奇 NET 框架本身在访问标准库时是否依赖于任何非托管 DLL 例如 我调用方法 A 并且 在幕后 方法 A 或该方法 A 内的任何其他方法对非托管 DLL 执行 PInvoke 是的 Net 库大量使用非托管函数 库可以调用两种
  • DateTime.Ticks 没有 100 ns 的分辨率? [复制]

    这个问题在这里已经有答案了 可能的重复 C DateTime Now 精度 https stackoverflow com questions 2143140 c sharp datetime now precision SO 有一些关于
  • SingleOrDefault异常处理

    我有一个示例代码 它调用 SingleOrDefault 方法 3 次 并在任何序列具有多个匹配元素时记录异常 如果我想检查这段代码的哪一部分抛出异常 问题就开始了 是否可以从此异常中获取一些有用的信息 例如谓词参数或集合类型以进行更详细的
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中

随机推荐

  • Java 中 int 转换为数组 char

    我试图在不使用字符串操作的情况下将整数转换为字符数组 我的尝试是 int number 12 char test Character toChars number for char c test System out println c 没
  • 在多对多关系上添加元素

    我正在做一个项目 从学校的角度 你可以计算每个学生的平均值 您可以在一个屏幕上注册学生 第一个实体 在另一个屏幕上注册科目 第二个实体 学生有姓名 电子邮件 成绩和平均分作为属性 科目有姓名 它们彼此之间是多对多关联的 我正在尝试为每个学生
  • UITableView 和单元格重用

    我有一个UITableView我已经子类化了UITableViewCell 叫它CustomCell 所以它有几个标签和一个UIImageView 只有某些单元格才会真正显示图像 这是我的代码tableView cellForRowAtIn
  • 如何获取AVPlayer的视频帧?

    我有 PlayerView 类用于显示 AVPlayer 的播放 代码来自文档 https developer apple com library archive documentation AudioVideo Conceptual AV
  • 来自 StringIO 源的 Python xml etree DTD?

    我正在调整以下代码 通过中的建议创建这个问题 https stackoverflow com questions 2835077 lxml unicode entity parse problems 它采用 XML 文件及其 DTD 并将它
  • 在 Vista 上安装后无法使用 gem 和 ruby​​ 命令

    我昨天按照此站点上的说明在 Vista 32 位上安装了 Ruby 和 Ruby on Rails http rubyonrails org down http rubyonrails org down 所以我下载了安装程序 然后是 Gem
  • 当数据量较小时,node.js response.write(data) 需要很长时间

    我注意到 Node js 中以下代码的性能出现了奇怪的行为 当尺寸为content为1 4KB 请求的响应时间大约为16ms 然而 当尺寸为content只有988字节 请求的响应时间奇怪地长得多 大致200ms response writ
  • AngularJS - ngSwitch 和 ng Click 在 ng Repeat 中不起作用

    我想显示列表的元素 这要归功于ngSwitch但我不知道该怎么做ngRepeat 我一开始没有列出清单 只是为了了解如何ngSwitch工作并向您展示我想要做什么 这里有一个 jsFiddle 可以帮助您理解 jdFiffle 1 http
  • 在 RStudio 中记录 R 包中的 R6 类和方法

    我正在努力处理 R6 类及其方法的文档 我的目标是在 RStudio 中获得方法的自动完成功能 目前 我只得到方法的名称 但没有得到我通常使用的帮助信息roxygen2用参数等记录函数 目前 这是我的班级 importFrom R6 R6C
  • NativeScript 与 Flutter [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我已经开始工作Nativescript 与 Angular https www nativescript org 最好的部分是代码共享技术 我可
  • UOW + Repository + Autofac加载两个不同的DbContext

    我今天遇到了一个问题 我无法解决它 我搜索了很多 但无法找到解决方案 如果可以的话请帮助我 我正在实现一个 MVC 应用程序 它使用 EF 存储库模式 工作单元和 Autofac 作为依赖注入器 我能够使用一个 DbContext 类 但我
  • 在访问外部Web服务之前获取代理配置(.NET 2.0)

    当尝试调用外部 Web 服务 通过互联网 上的方法时 它抛出了我 远程服务器返回错误 407 需要代理身份验证 为了解决这个问题 我使用以下代码来设置我们在办公室使用的代理 Set the system proxy with valid s
  • 更新+使用(行锁)+ CTE

    我找不到任何有关 T SQL 语句语法的文档 我需要做一个WITH ROWLOCK CTE 结果更新 像这样的东西 所以更新后将是top1000 table1 col2 声明WITH ROWLOCK 在更新 table1 的行期间至关重要
  • 如何将对子模块所做的更改的提交推送到主 git 存储库中?

    我决定将我的应用程序存储库从 SVN 切换到 git 我的回购结构是这样的 AndroidStudioProjects MyMine tree L 1 ActionBarSherlock Android Universal Image Lo
  • 存储8个整数的avx2指令是什么?

    我想存储a中的8个整数 m256i变量为 8 x 32 位数组ints 我认为这方面的说明是 mm256 store epi32 但我收到一条错误消息 该指令甚至不存在 看看 根据您的目的地是否一致 您需要 or
  • 寻找橄榄球联赛中连续获胜次数最多的次数

    假设橄榄球联赛的结果是由这种数据给出的 Date Round Home Team Visitor Team Result 18 10 2018 1 ABC XYZ 30 20 18 10 2018 1 PQR ABC 13 12 有人可以阐
  • Flutter Firebase Google 登录无法正常工作。选择账户后停止

    我目前正在尝试在我的应用程序中实现谷歌登录和身份验证 我已经建立了一个项目并在 Firebase 中创建了一个应用程序 将 google services json 放入应用程序中 将必要的插件添加到 build gradle 并在 fir
  • 使用 conv1D “检查输入时出错:期望 conv1d_input 有 3 个维度,但得到形状为 (213412, 36) 的数组”

    我的输入只是一个 csv 文件237124行和37列 首先36列作为特征 The last列是一个二进制类标签 我正在尝试在 conv1D 模型上训练我的数据 我尝试过建立一个一层 CNN 但我有一些问题 编译器输出 ValueError
  • 如何从cmd永久更新系统PATH变量?

    我们可以用setx正如所讨论的here https stackoverflow com a 10411111 248616 setx PATH PATH C Something bin 但此命令只能更改为用户 PATH 变量 而不是系统变量
  • 是否可以从 .NET 中的动态方法调用内部方法?

    我正在尝试从动态生成的方法调用内部方法 il代码很简单 ldarg 0 callvirt ret 执行该方法失败 并出现 TypeLoadException 表示无法加载定义内部方法的类型 当我想到这一点时 这似乎是合乎逻辑的 因为动态方法