2011-12-21 4 views
7

Я программировал .NET и C# уже много лет, но только недавно столкнулся с типом DynamicMethod и концепцией динамической сборки в контексте отражения. Кажется, что они всегда используются в генерации IL (runtime code).Динамические ассембли и методы

К сожалению, MSDN делает чрезвычайно трудную работу по определению того, что динамическая сборка/метод actallty составляет, а также то, для чего они должны использоваться. Может ли кто-нибудь просветить меня здесь, пожалуйста? Есть ли что-нибудь, что связано с DLR? Как они отличаются от статической (нормальной) генерации сборок и методов во время выполнения? Что я должен знать о том, как и когда их использовать?

+0

В структуре не существует типа «DynamicAssembly». Вы говорите об AssemblyBuilder? Учебник MSDN Reflection.Emit находится здесь: http://msdn.microsoft.com/en-us/library/3y322t50.aspx –

+0

@Dan Rigby: Cheers. – Noldorin

+0

@ HansPassant: Хорошо, может быть, нет типа, но определенно концепция: http://msdn.microsoft.com/en-us/library/4xtysk39.aspx – Noldorin

ответ

4

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

Надеюсь, что это поможет.

+0

И это не имеет ничего общего с DLR. Это метод, созданный «на лету». – ivowiblo

+0

А, я вижу. Это проясняет это, так что спасибо за это. Есть ли какой-либо эквивалент в динамическом * типе * или таком? А как насчет сборки? Я думал, что всегда мог создавать сборки на лету в прошлом, и я не помню, чтобы слово «динамическое» действительно входило в него. – Noldorin

+0

Для типов и сборок это просто именование. DynamicMethod - это фактический класс. – ivowiblo

Смежные вопросы