c# - 动态程序集和方法

标签 c# .net reflection dynamicmethod dynamic-assemblies

我已经编写 .NET 和 C# 程序多年,但直到最近才在反射上下文中遇到 DynamicMethod 类型以及动态程序集的概念。它们似乎总是在 IL(运行时代码)生成中使用。

不幸的是,MSDN 在定义什么是动态程序集/方法以及它们应该用于什么方面做得非常糟糕。任何人都可以在这里启发我吗?与DLR有什么关系吗?它们与运行时静态(正常)生成的程序集和方法有何不同?关于如何以及何时使用它们,我应该了解什么?

最佳答案

DynamicMethod 用于在没有任何新程序集的情况下创建方法。它们也可以为类创建,因此您可以访问它的私有(private)成员。最后,DynamicMethod 类将构建一个可用于执行该方法的委托(delegate)。例如,为了访问私有(private)字段:

var d = new DynamicMethod("my_dynamic_get_" + field.Name, typeof(object), new[] { typeof(object) }, type, true);
var il = d.GetILGenerator();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, field);
if (field.FieldType.IsValueType)
    il.Emit(OpCodes.Box, field.FieldType);
else
    il.Emit(OpCodes.Castclass, typeof(object));

il.Emit(OpCodes.Ret);
var @delegate = (Func<object, object>)d.CreateDelegate(typeof(Func<object, object>));

希望对您有所帮助。

关于c# - 动态程序集和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8592050/

相关文章:

c# - 没有注入(inject)的模拟

c# - 在 .NET 中将流(未知长度)转换为字节数组的最佳方法?

java - 设计模式问题

java - 使用反射在 java 中为 android 转换对象

c# - 带条件排序的 LINQ OrderBy/ThenBy

c# - 在 C# 中定义不同类型的数字

c# - 如何在c#中声明动态数组

java - 反射(reflect) : Instantiate and throw exception from classname in string

c# - 如何每次在每个测试方法(包含在同一测试装置中)之前初始化实例变量(在 nunit 的测试装置中声明)?

c# - 将二进制文件或 byte[] 从 c# 传递到 java