问题标签 [ilgenerator]

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 回答
313 浏览

c# - IL代码调用不带参数的方法

我想 IL 生成一个动态方法

调用签名的方法mc并返回其out参数。

但我不知道如何处理 out 参数。这是我到目前为止的代码。

需要什么才能使输出参数起作用?

0 投票
1 回答
116 浏览

c# - 在 2 个或多个 dll 之间复制汇编代码

我在程序集中有字节码。我想将此代码复制到另一个程序集。这并不容易,但乍一看我得到了一个很好的副本。我可以复制命名空间、类、自定义属性、字段等。但是我对方法体有疑问。

我知道我可以通过以下方式获取代码:

此外,我知道如何设置新方法 Body:

变量定义如下:

  • method : MethodInfo //原始方法
  • param : List //参数类型列表
  • exec : List // 所有异常子句的列表
  • sig : SignatureHelper //不太确定,但与当地人有关

现在我有以下结果:

首先是原始方法:

现在,我在另一边得到了什么:

我已经尝试加载原始 dll 的每个依赖项,但这不会改变任何东西。

SetMethodBody 方法定义为:

没有关于“tokenFixups”的信息。

这些修正是什么?我怎样才能得到它们?或者错误可能在其他地方?

编辑:似乎只有函数调用是无效的。如果我可以从它的字节表示中识别函数,我可以解决这个问题。

0 投票
1 回答
204 浏览

c# - 来自属性的字段的 ILGenerator 调用方法

我正在尝试在 ILGenerator 中编写一些有助于延迟加载的代码。我遇到的问题是在使用 TypeBuilder 构建的类的私有字段上找到的加载方法。

我想在 IL 中完成的是以下

以下是我目前写的ILGenerator代码

0 投票
0 回答
81 浏览

c# - ILGenerator:如何生成一个 Func<> 作为参数传递

我正在尝试围绕由接口定义的服务创建代理包装器,以向服务的开发人员用户“隐藏”客户端特定的调用代码。

我已经能够生成大部分包装类本身,但现在正在努力为预先存在的客户端调用生成 Func 参数。

一个示例 TService 有一个接口:

客户端实现的签名是:

直接调用时,开发人员当前会写如下内容:

虽然首选的选项是他们可以调用:

因为这允许 DI 使用 IService 接口注入本地服务或我的远程包装器,并且开发人员不需要考虑它是远程服务还是本地服务。

我目前让我的 typebuilder 生成所需的代码来创建从客户端继承的包装类baseType并针对它定义所有接口方法,但目前将 null 作为Func<TService, Task<TResult>> operation.

从这里我有点坚持到底如何定义 Func<>service => service.ServiceMethodWithResultAsync(requestDTO)包括requestDTO我期望/假设的参数Ldarg_1Ldarg_2

非常感谢任何和所有帮助。

0 投票
0 回答
48 浏览

c# - Getting a "Common Language Runtime detected an invalid program." error when trying to map ReadUnaligned using DynamicMethod and ILGenerator

I'm trying to map the IL code for ASP.CORE method ReadUnaligned as defined here in .NET Frameword using DynamicMethod following this example.

When trying to run the code, I get the "Common Language Runtime detected an invalid program." error.

My code:

The call to the method is:

Where ReadProcessMemory is taken from kernel32.dll

Any idea what I'm doing wrong?

0 投票
1 回答
102 浏览

c# - 使用 ILGenerator 从 try 和 catch 内部返回一个值

我目前正在尝试生成一种方法,该方法将在 try 块内返回结果。等效的 C# 代码如下所示:

而且我知道,这显然永远不会引发错误,但这只是我正在尝试做的事情的缩短,我可以将问题归结为 try/catch。

这是我到目前为止得到的:

我或多或少直接从sharplab.io获得了 IL 。

然而,这种方法向我抛出了一个异常:

System.InvalidProgramException:“公共语言运行时检测到无效程序。”

据我所知,这表明我以某种方式搞砸了 IL。

0 投票
1 回答
85 浏览

c# - 跳过不使用 DynamicMethod 的动态生成方法的可见性检查

这个问题与其他两个问题非常相似,请参见:firstsecond。然而,这些至少可以说已经过时了,我希望 .Net 5 改变了一切。

现在首先让我澄清这个问题。用一个简单的例子来尝试获取 a 的底层数组List<int>.

这工作得很好,因为我可以告诉DynamicMethod跳过可见性检查(即使它也可以工作,当DynamicMethod构造函数的最后一个参数true被删除时)。

但是,当我尝试对下面的示例执行相同操作时,它会抛出一个FieldAccessException.

System.FieldAccessException:尝试通过方法 'GetUnderlyingArrayClass.GetUnderlyingArray(System.Collections.Generic.List'1)' 访问字段 'System.Collections.Generic.List'1<System.Int32>._items' 失败。+ GetUnderlyingArrayClass.GetUnderlyingArray(列表)

这是一个 .Net fiddle 链接,上面显示的代码。

现在,我提到的问题之一指向以下属性ReflectionPermissionAttribute。但是,正如文档中所述Code Access Security is not supported or honored by the runtime.。据我了解,这基本上意味着 .Net Core/.Net 5不支持 CAS

这是我感到困惑的地方。将skipVisibility参数设置为trueorfalse并不重要。我认为这是因为我在 .Net 5 环境中运行代码。但是,如果 .Net 5 不支持 CAS,为什么我仍然能够读出私有字段?

目标显然是使用DefineType/ DefineMethodAPI 从动态生成的方法访问私有字段/方法。

0 投票
0 回答
104 浏览

c# - InvalidProgramException:发出具有非 void 返回类型的 IL 代码时发生无效的 IL 代码

我试图通过创建一个 DynamicMethod 来降低反射方法的调用时间,用它的 IL 生成器发出 IL 代码,然后使用它的 CreateDelegate 方法创建一个委托。到目前为止,即使新方法调用仍使用 (object callObject, object[] params) 作为参数,调用时间也显着减少。当返回类型不是 void 时,生成的 IL 代码中会出现问题。我对MSIL一无所知,做了很多研究,但一无所获。这是有效的代码:

结果时间(仅测量调用时间)与普通 MethodInfo.Invoke 相比要快得多。但是,通过以下调整,IL 生成器会抛出错误:

当预期的返回类型不是 void 时,将引发以下异常:

有谁知道如何解决这个问题?

编辑:在返回操作码之前添加了装箱:

然后抛出以下内容:

0 投票
0 回答
61 浏览

c# - 在 .NET 动态方法中调用 System.Action

我有一个正在构建动态方法的函数。作为此动态方法的一部分,它正在调用生成时已知的操作。作为一个最小的可重现示例,请考虑以下 C# 代码:

当我运行它时,我得到一个 System.InvalidProgramException。这样做的正确方法是什么?