问题标签 [dynamicmethod]

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 投票
5 回答
1229 浏览

c# - 如何将多个表达式组合成一个快速方法?

假设我有以下表达式:

我希望能够将它们编译成等效于以下内容的方法/委托:

解决这个问题的最佳方法是什么?我希望它表现良好,理想情况下具有与上述方法相当的性能。

更新 因此,虽然似乎没有办法直接在 C#3 中执行此操作,但有没有办法将表达式转换为 IL,以便我可以将它与 System.Reflection.Emit 一起使用?

0 投票
2 回答
218 浏览

c# - 动态方法 NullReferenceException

谁能告诉我这里的 IL 代码有什么问题?

我在这里要疯了,因为我已经编写了一个测试应用程序,它执行与上述相同的操作,但是在 C# 和反射器中,其中的 IL 代码看起来就像我上面的 DynamicMethod 的 IL 代码(除了我的测试 C# 应用程序使用具有公共字段而不是上面枚举中的私有值字段的 TestStruct,但我已将 skipVisibility 设置为 true)...

我得到一个 NullReferenceException。

我的 DynamicMethod 的签名是:

我生成这样的方法:

而且我绝对不会传递任何空值。

提前致谢!

0 投票
1 回答
868 浏览

c# - JIT 编译器错误 - 使用 Reflection.Emit 的程序异常无效

有人可以向我解释为什么以下内容适用于第一个测试但会引发 InvalidProgramException 用于第二个测试?我难住了。

}

0 投票
1 回答
65 浏览

.net - 订阅事件时如何传值,事件触发时获取(DynamicMethod使用问题)

任务是在运行时创建事件处理程序。对于不同的事件,我需要使用不同的参数值调用一种方法。事件及其编号仅在运行时已知。所以我试图生成动态方法,每个方法都将分配给某个事件,但通常它们都只是将一些值传递给实例方法并调用它。

如果可以以更简单的方式完成类似的事情,那就太好了。我的意思是在订阅阶段传递一些值,然后在触发事件时获取它。

这就是我现在想要做的:

0 投票
2 回答
1098 浏览

.net - 如何使我的 DynamicMethod 安全关键?

我有一个相当复杂的场景,我想创建一个附加到内存中 AssemblyBuilder 中的类的 DynamicMethod。动态方法在我的(常规)程序集中调用方法“GetReplacement”。

这在 .NET 2.0 中运行良好,但在 .NET 4.0 中出现错误:

根据我的阅读,我的动态方法(上述错误中的 Max)是安全透明的,因为它附加到的程序集(AssemblyBuilder)是透明的。我猜 AssemblyBuilder 是透明的,因为它是一个动态程序集。

如何使我的动态方法变得至关重要,或者尽一切可能授予它调用 GetReplacement 的权限?我想在 GetReplacement 的程序集中调用其他几个方法,因此修复动态方法比以某种方式标记 GetReplacement 更好。

我有点迷路,希望得到一些帮助!

0 投票
1 回答
397 浏览

c# - c# + 使用带属性的动态方法

在 c# 中如何使用 DynamicMethod 编写上述内容?

更新; 根据 casperOne,您不能使用自定义属性执行此操作。

但是非自定义属性呢,例如:

注意:我创建了一个新帖子,因为我的上一个帖子错过了以下要点:我正在驾驶的是......我如何动态创建一个包含属性的方法?

另外,我问过使用DynamicMethod,有没有更好的方法?

0 投票
0 回答
207 浏览

vb.net - 通过使用代码生成动态添加处理程序来捕获事件

我需要连接应用程序中的所有事件并跟踪所有信息(引发、争论等)。

我在 Stackoverflow 找到了这个: Tracing all events in VB.NET

但是,我需要一个解决方案,不仅将调用的事件写入控制台,而且调用 TraceVerbose 并使用显示发送者和事件参数的参数。

我仍在努力了解动态代码生成和 IL,因此我不知道如何让代码使用事件中的参数调用跟踪方法。

谁能告诉我怎么做(在 VB.NET 中)?

0 投票
4 回答
3297 浏览

c# - 如何从 DynamicMethod 获取 IL 字节数组?

作为一个新奇事物,我试图看看 IL 与运行时生成的轻量级代码与 VS 编译器生成的代码有何不同,因为我注意到 VS 代码往往以不同的性能配置文件运行,例如演员表。

所以我写了以下代码::

不幸的是,这会引发异常,因为 GetMethodBody 显然是对表达式树生成的代码的非法操作。如何以库的方式(即不使用外部工具,除非该工具具有 API)查看使用轻量级代码生成的代码生成的代码?

编辑:错误发生在第 5 行,compiled.Method.GetMethodBody() 抛出异常。

Edit2:有谁知道如何恢复方法中声明的局部变量?或者没有办法GetVariables?

0 投票
1 回答
1663 浏览

c# - 从动态方法解析在 IL 中找到的令牌

感谢 Hans Passant 在这里回答我的问题: 如何从 DynamicMethod 获取 IL 字节数组?

我能够起床并跑步。我现在正在尝试解析在发出的 IL 中找到的元数据令牌,以查看正在调用哪些方法,或者不调用哪些方法。我能够解决方法主体中的下一个标记是调用。我正在使用来自Mono.ReflectionMethodBodyReader 的一些代码。

抛出一个异常,表示该令牌在该域中是不可解析的。有人在这里有窍门吗?我应该尝试传入代表泛型参数还是它们完全没用?

我目前正在考虑为表达式树的代表编写一个反编译器的想法,我真的很希望能够使用我自己编译的表达式树作为测试用例,因为我总是可以回到原始状态并进行比较。

0 投票
6 回答
5384 浏览

c# - 使用 DynamicMethod 的运行时代码注入?

考虑以下简单代码:

我想做的是将一些调试代码注入 Foo 委托,这将是等效的:

扭曲是我必须能够在运行时执行此操作,因此编译时和后处理方法是不可能的。

我最初的方法使用 Delegate.Combine() 将 prologue 和 epilogue 方法添加到 Foo 委托。唉,这行不通,因为它会处理返回值。

我目前的想法是使用 System.Reflection.Emit 和 DynamicMethod 作为潜在的解决方案。据我所知,我需要获取 FooImplementation 的 MethodInfo,获取它的 MethodBody,将其转换为 DynamicMethod 并将我的 try-finally 块注入其中。

不幸的是,我完全不知道如何做到这一点。有人愿意伸出援手吗?还是您有另一个(最好更简单)的想法?

编辑:这里的用例是调试 OpenGL 绑定 (http://www.opentk.com)。我们必须注入 2226 个参数差异很大的方法,因此需要一个通用的方法。