问题标签 [il]

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 投票
2 回答
1266 浏览

c# - 在运行时将 IL 代码转换为 C#

是否有任何免费库允许在运行时将 IL 代码转换为 C#?

谢谢,克里斯蒂安

编辑

这是我所拥有的一个例子:

在我的程序中,有时我有一个字符串列表,类似于位于某个程序集中的类的 IL 代码:

现在有了这个字符串数组(每个字符串一行),我想以某种方式生成相应的 C# 代码。

有谁知道ILSpy是否可以做到这一点?

0 投票
1 回答
200 浏览

.net - Reflection.Emit IL中下面的代码是什么

我有以下

但这似乎不起作用

代码,我真的很想生成:

我在这里有以下代码:http: //pservicebusext.codeplex.com/SourceControl/changeset/view/4f8a4f1190ae#PServiceBus.RemoteProxy%2fPServiceBus.RemoteProxy%2fESBProxy.cs

有一个名为 CreateProxy() 的方法假设生成上面的代码。但是该部分循环并为该方法生成 get 和 set 无法正常工作。它从不设置请求对象的值,它总是保留为空

我解决了这个问题,我从使用 OpCodes.Ldarg_0 更改为 OpCodes.Ldarg_1

0 投票
3 回答
3488 浏览

c# - 使用 Br_S OpCode 使用 Reflection.Emit.Label 指向下一条指令

我正在尝试解析 IL 以发出一种方法。我在 string[] 中获得了一个方法的 IL 代码,其中每个字符串都是一条 IL 指令。我正在循环这个数组并使用 ILGenerator 添加操作码:

这是我需要重现的 IL:

这是我得到的输出:

如您所见, br.s 调用指向自身,这当然会导致无限循环。如何让它指向源代码中的以下指令?这与使用 Reflection.Emit.Label 有关,但我不确定它是如何工作的。

编辑顺便说一下,上面看到的 IL 是针对这种简单方法的,

0 投票
2 回答
764 浏览

.net - 为匿名方法生成 IL

我想为多线程应用程序生成 IL。作为第一步,我编写了一个简单的应用程序并使用 ILSpy 检查生成的 IL。

我能够使用 System.Reflection.Emit 命名空间生成上述大部分 IL 代码。

不幸的是,我不知道如何使用 System.Reflection.Emit 生成以下 IL 代码。

那么有人可以帮我弄清楚如何为匿名方法生成 IL 吗?

0 投票
2 回答
496 浏览

c# - IL Emit TypeBuilder 和解析引用

我正在发出几个类,其中一些需要在它们自己的构造函数中构造它们的对等点。没有无限的递归依赖(因此,如果 A 构造 B,B 将不会构造 A;这对于嵌套引用也是如此 [A 构造 B 构造 C 意味着 B 和 C 都不会构造 A])。我目前正在处理发出构造函数的代码,但我遇到了一些问题。我不知道预先依赖的顺序,所以我似乎有几个选择:

  1. 不知何故,通过它们的依赖对类进行排序,并按照它们的依赖顺序“构建”它们,因此更多依赖的类有一个有效的构造函数引用来抓取。
  2. 在第一遍中分别定义所有构造函数(实际上不为方法发出 IL),以便定义所有构造函数引用。
  3. 以某种方式缓存已定义的构造函数,以便如果尚未定义构造函数,我可以创建一个占位符 ConstructorBuilder 来获取引用,然后在构造函数最终发出时获取该引用。

我目前正在尝试选项(3),我想知道 TypeBuilder 是否已经有办法做到这一点。我有看起来像这样的代码(在需要时获取构造函数引用):

我的 Build 方法目前是这样开始的(如果之前定义了构造函数,我认为这不会起作用):

是否有某种方法可以查找先前定义的 ConstructorBuilder(如果已定义),而无需创建自己的显式缓存?似乎 TypeBuilder 应该知道它,但我看不到从 TypeBuilder 文档中查找它的任何明显方法。


编辑:

我最终沿着路线 (2) 走下去,它在第一遍中定义了所有相关方法,然后在第二遍中发出 IL。我仍然很好奇是否可以从 TypeBuilder 中为已经在其他地方定义的构建器获取 MethodBuilder 实例(或 ConstructorBuilder 实例)。

0 投票
1 回答
590 浏览

c# - 在不使用 ref 关键字的情况下替换参数的 ref(使用 IL)

我希望能够替换参数的对象引用,而不必使用 ref 关键字。

我避免使用 ref 的原因是为了保留寻找Add(T item)方法的集合初始化程序调用,并且我需要让集合类用它的接口的不同实现替换引用。

我尝试了几种不同的方法来做到这一点。首先,我尝试使用未记录的关键字__makeref,__refvalue__reftype.

其次,我尝试DynamicMethod使用一些 IL 创建一个,该 IL 试图模仿我通过查看带有 ref 参数的反汇编的类似调用所观察到的内容。

下面是一些代码来演示:

谢谢你。

0 投票
3 回答
2890 浏览

c# - IL,发出默认构造函数调用

我在运行时生成新类型,在生成默认构造函数后,我想生成另一个带有参数的构造函数。我这样做是这样的:

问题是,我无法从方法 GenConstructorWithParameters 调用默认构造函数,因为 CLR 不允许我编写如下内容:

如何发出对默认构造函数的调用?有可能吗?

tb - 的实例TypeBuilder,cb -ConstructorBuilder

0 投票
2 回答
2798 浏览

.net - 鉴于我手头有所需的 MethodInfo 和实例类型,如何使用 OpCodes.Callvirt 发出 OpCodes.Constrained

我有一个递归函数emit : Map<string,LocalBuilder> -> exp -> unitil : ILGenerator它是函数的全局函数,exp是一个判别联合,表示带大小写的类型检查解析语言,InstanceCall of exp * MethodInfo * exp list * Type并且Typeexp表示表达式类型的属性。

在下面的片段中,我试图为实例调用发出 IL 操作码,其中instance.Type可能是也可能不是ValueType. 所以我知道我可以OpCodes.Constrained用来灵活有效地对引用、值和枚举类型进行虚拟调用。一般来说,我是 Reflection.Emit 和机器语言的新手,因此理解链接文档对OpCodes.Constrained我来说并不强大。

这是我的尝试,但它会导致VerificationException“操作可能会破坏运行时的稳定性。”:

查看文档,我认为关键可能是“托管指针 ptr 被压入堆栈。ptr 的类型必须是 thisType 的托管指针 (&)。请注意,这与无前缀的情况不同callvirt 指令,它需要 thisType 的引用。”

更新

谢谢@Tomas 和@desco,我现在明白什么时候使用OpCodes.Constrainedinstance.Type是ValueType,但是methodInfo.DeclaringType是引用类型)。

但事实证明我还不需要考虑这种情况,我真正的问题是堆栈上的实例参数:我只花了 6 个小时就知道它需要一个地址而不是值(查看 DLR 源代码给了我线索,然后在一个简单的 C# 程序上使用 ilasm.exe 就清楚了)。

这是我的最终工作版本:

0 投票
1 回答
455 浏览

.net - 如何在 .NET 程序集中重命名 [空格] 类型

给定一些带有某种类型的程序集,如何重命名和重命名该类型的空间,使其位于不同的位置?或者也许只是提取类型并将其移动到不同的程序集。

有什么工具可以做到这一点吗?(塞西尔?) 有没有关于这个工具的 tuts ?

谢谢

背景打消“你为什么要那样做,白痴?!” 回复:

我在 Web 应用程序中预编译我的视图,然后将程序集合并在一起。我正在使用自定义虚拟路径提供程序从许多物理和虚拟位置加载视图(有些是预编译的,有些不是)。预编译的视图有“不正确”的名称和命名空间,所以我需要更正它。(除非有办法让aspnet_compiler名称和命名空间一开始就不混乱?另外,我知道我可以让我的 VPP 搜索修改后的命名空间中的视图,这不是重点。

0 投票
1 回答
93 浏览

.net - 一个简单的 Pop 然后重新加载不起作用

在调用返回一个的函数后object,我尝试将堆栈中的值存储在局部变量中,然后将其推回,但它失败并出现异常

以调用目标引发异常

代码如下:

如果我删除Stloc_3并且Ldloc_3一切正常,我就会迷失在这里。