пʼятниця, 30 травня 2008 р.

Динамическая загрузка и использование сборок. Reflection

Reflection - чрезвычайно удобная вешь, позволяющая, среди прочего, выполнять динамическую загрузку сборок и выполнение кода из этих сборок.

Я покажу простой пример, как это можно сделать:

Предположим, что у нас есть некая сборка cl, которая включает в себя класс Class1:


using System;

namespace cl
{
public class Class1
{
public void Write()
{
Console.Write("Hello, world!");
}
}
}

Скомпилируем сборку и положим ее, например, на c:\cl.dll

Далее попробуем динамически подгрузить эту библиотеку и вызвать метод Write()

Получаем:
using System;
using System.Reflection;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Assembly asm = Assembly.LoadFile("c:\\cl.dll");
object cl = asm.CreateInstance("cl.Class1");
Type clType = cl.GetType();
MethodInfo method = clType.GetMethod("Write");
method.Invoke(cl, null);
}
}
}

Если методу требуется передать какие либо параметры, тогда следует передать их в методе Invoke() экземпляра MethodInfo.
Делается это так:

method.Invoke(cl, new object[] {"Some argument"});


Вот так все просто :)

Правда, применять это следует с осторожностью. Во первых, reflection работает довольно медленно, во вторых - таким образом можно создать массу дыр в безопасности.
Кстати, вопросы производительности очень хорошо описаны в статье тут: http://rsdn.ru/article/dotnet/reflectionspeed.xml

Немає коментарів: