【问题标题】:Dynamic Assemblies and Methods动态程序集和方法
【发布时间】:2011-12-21 15:15:31
【问题描述】:

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

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

【问题讨论】:

标签: c# .net reflection dynamicmethod dynamic-assemblies


【解决方案1】:

DynamicMethod 用于创建无需任何新程序集的方法。它们也可以为一个类创建,因此您可以访问它的私有成员。最后,DynamicMethod 类将构建一个委托,您可以使用它来执行该方法。例如,为了访问私有字段:

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>));

希望对你有帮助。

【讨论】:

  • 而且它与 DLR 无关。这是一种动态创建的方法。
  • 啊,我明白了。这清楚了一点,所以谢谢你。在动态 type 等中是否有任何等价物?或者组装呢?过去我以为我总是可以即时创建程序集,但我不记得“动态”这个词真的出现过。
  • 对于类型和程序集,它只是一个命名。 DynamicMethod 是一个实际的类。
  • 哦,所以人们会像在 .NET 中通常那样创建一个“动态”程序集/类型吗?幕后也发生同样的事情?
  • 是的,使用 AssempblyBuilder 和所有爵士乐。当您动态创建它们时,它们称它们为“动态的”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-06
  • 2012-10-27
  • 2014-09-18
  • 2011-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多