问题标签 [reflection.emit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
918 浏览

.net - 是否可以在将自身指定为泛型类型参数的同时发出从泛型类型派生的类型?

想象一下以下完全合法的类型层次结构:

我的问题是 A<> 的静态编译定义是否可以动态发出类型 B ?

问题是如何在ModuleBuilder.DefineType.

或者也许有另一种方法来产生这种类型,除了

  • 使用上述方法
  • 使用 CodeDom(这很像创建一个临时文件并将其传递给 csc.exe :-))

编辑: 该类型B应该具有显式的公共默认构造函数,调用从A<B>.

0 投票
1 回答
745 浏览

c# - System.CodeDom.CodeCompileUnit 来自 System.Reflection.Emit.AssemblyBuilder 实例

我正在查看 TLBImp2 的 CodePlex 代码,并希望从发出的 IL 生成 C# 源代码。

有没有办法从 System.Reflection.Emit.AssemblyBuilder 实例中获取 System.CodeDom.CodeCompileUnit?

0 投票
2 回答
1175 浏览

c# - 使用 MethodBuilder 生成动态 IL 时是否可以跳过可见性检查?

使用 DynamicMethod 生成 IL 时,如果在DynamicMethod 构造函数中为 restrictedSkipVisibility 参数提供“true”,则可以调用方法和访问原本无法访问的字段

我更愿意将动态 IL 发送到动态程序集中,这样我就可以在构建时将生成的 IL 保存到程序集中。如果我使用这种方法,我必须使用 MethodBuilder 而不是 DynamicMethod。但是,我需要能够跳过可见性检查,以便在运行动态代码时不会得到 MethodAccessException。有没有办法做到这一点,如果有怎么办?

0 投票
2 回答
1152 浏览

c# - 创建动态枚举并尝试引用它失败并出现 BindingFailure

我需要创建一个动态枚举,然后能够使用 Type.GetType() 获取类型。这可能吗?

下面的代码将创建一个动态枚举,并尝试使用它的限定名称。如果我首先存储程序集(使用 AssemblyBuilderAccess.RunAndSave),这很好。但是,如果我只使用 AssemblyBuilderAccess.Run,​​这是不可能的;发生 BindingFailure 错误;无法找到程序集。我的印象是,运行选项将允许创建和使用,而无需实际存储程序集(或访问不同的构建器)。

(注意:下面的 Type.GetType() 代码用法不是我的。我无法更改该代码。)

如何在不存储程序集的情况下创建动态枚举并引用它?

0 投票
3 回答
651 浏览

.net - 是否有工具可以简化 Reflection.Emit 的工作?

我需要动态生成一些类型。生成的类型有几个方法,构造函数,实现一个接口并定义静态构造函数。有没有可以帮助完成任务的工具?

我知道反射器的这个插件,但它只在方法级别有用,而我必须生成一个完整的类型。

Run#,但它处于 pre-alpha 阶段,此外,我想要一个在离线模式下工作的独立工具,这样我就可以将 reflect.emit 指令复制粘贴到生产代码中。

0 投票
2 回答
1555 浏览

.net - 将 .NET 表达式树链接到新程序集

我正在尝试编写自己的玩具 My Toy Language -> MSIL 编译器,以便更好地了解编译器的工作原理。我得到了解析和词法分析工作,我已经构建了表达式树并使用 System.Linq.Expressions 表达式树 API,我有一个工作解释器。现在我想发出一些真正的 MSIL 程序集。

问题是,我不知道如何实际构建这些程序集。MethodBuilder只接受原始 MSIL 方法体,因此我必须获取表达式树的原始 MSIL。调用Expression.Compile()返回一个工作委托,但我无法获得它的底层 MSIL。调用MethodInfo.GetMethodBody()会引发 InvalidOperationException,因为它未在该特定子类中实现。

如何将该委托链接到新程序集?

0 投票
5 回答
17388 浏览

c# - 使用 Reflection.Emit 创建实现接口的类

我需要使用实现以下接口的 Reflection.Emit 生成一个类。

有没有人有一个例子说明我如何将以下内容作为一个简单的测试用例发出?

0 投票
3 回答
1550 浏览

c# - 如何发出代码并将其注入已加载的程序集中?

我已经使用 System.CodeDom.CodeCompileUnit 动态地构建了一些类型,想要将它们编译成内存中的 IL 代码,并将该 IL 代码注入到内存中加载的程序集中 - 无需将任何内容保存到磁盘。也许我的计划是错误的。接受有关如何将该 CodeCompileUnit 实例到达所述目的地的其他建议。

0 投票
2 回答
1694 浏览

reflection.emit - 显式接口实现和 Reflection.Emit

有人知道如何使用 Reflection.Emit 显式地实现接口的属性吗?

0 投票
1 回答
1913 浏览

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

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

执行该方法失败,TypeLoadException 说它无法加载定义内部方法的类型。

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

但是,我预计动态方法仍然可以工作,就像 Delegate.CreateDelegate 一样。毕竟,我确实设法获得了内部方法的 MethodInfo,所以权限障碍在我身后。

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

谢谢。

编辑:

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

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

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

由 Delegate.CreateDelegate 创建的类型安全委托有效,而使用 DynamicMethod 的委托因 TypeLoadException 而失败。

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