c# - 使用 Reflection.Emit 创建一个方法,然后调用它

标签 c# .net dynamic reflection reflection.emit

这听起来很明显,但我遇到了很多困难。基本上,我正在做的是使用 Reflection.Emit 生成一个方法,然后我想调用它。到目前为止,我有方法构建等,但是在构建之后我无法获得对该方法的引用,因为“在创建类型之前不支持调用的成员。”

这是我基本上做的:

AssemblyBuilder assembly;
ModuleBuilder module;
TypeBuilder containerTypeBuilder;
Type containerType;
var name = new AssemblyName();
name.Name = "DynamicWrapper";
var domain = Thread.GetDomain();
assembly = domain.DefineDynamicAssembly(name, AssemblyBuilderAccess.RunAndSave);
module = assembly.DefineDynamicModule(assembly.GetName().Name, false);
containerTypeBuilder = module.DefineType("__DynamicWrapperType",
                              TypeAttributes.Public | TypeAttributes.Class |
                              TypeAttributes.AutoClass |
                              TypeAttributes.AnsiClass | TypeAttributes.BeforeFieldInit |
                              TypeAttributes.AutoLayout, typeof(object));
//build method
var mb = containerTypeBuilder.DefineMethod("generatedmethod" + (unique++),
                              MethodAttributes.Public | MethodAttributes.Static, typeof (int),
                              new Type[] {});
//build method body and all that
.....
var type=module.GetType("__DynamicWrapperType");
var info=type.GetMethod(mb.Name, BindingFlags.Static | BindingFlags.Public); //error here

如何获取我新构建的方法并加载它以便我可以调用它?

此外,我已经尝试过 mb.Invoke,但结果是“动态模块不支持调用的成员。”

最佳答案

如果您正在创建单独的方法,那么 DynamicMethod 是更好的选择(特别是因为您的方法是静态的)- 您只需使用 CreateDelegate(指定委托(delegate)类型),给那个委托(delegate),然后调用。它的开销也更少,并且具有收藏值(value)。

但是如果你被迫使用MethodBuilder:你必须在TypeBuilder上使用CreateType,然后在现在的上使用反射真实 类型(从 CreateType 返回)。

关于c# - 使用 Reflection.Emit 创建一个方法,然后调用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13481921/

相关文章:

c# - BindingList<> 更改时 UI 未更新

用于动态创建的 html 页面的 php 或 jquery?

c#-4.0 - C# 动态对象的模拟/ stub 框架

c# - 文本框中显示意外字符

c# - Powershell 和 C# 中的交换

c# - 一种通用列表反序列化类?

.net - 为什么 Log4Net 过滤器会接收评估器阈值之外的消息?

c# - 如何检查标签是否在xslt中包含特定字符串

.net - LINQ 性能 - 延迟执行与立即执行

delphi - 触摸动态表单时访问冲突?