Загрузить сборку MyClasses.exe.



Assembly asm = Assembly.LoadFrom("MyClasses.exe");

Обнаружить типы, содержащиеся в сборке MyClasses.exe.

Type[] alltypes = asm.GetTypes();

Foreach (Type temp in alltypes)

Console.WriteLine("Найдено: " + temp.Name);

Console.WriteLine();

Использовать первый тип, в данном случае — класс MyClass.

Type t = alltypes[0]; // использовать первый найденный класс

Console.WriteLine("Использовано: " + t.Name);

Получить сведения о конструкторе.

ConstructorInfo[] ci = t.GetConstructors();

Console.WriteLine("Доступные конструкторы: ");

foreach (ConstructorInfo с in ci) {

Вывести возвращаемый тип и имя.

Console.Write(" " + t.Name + "(");

Вывести параметры.

ParameterInfo[] pi = с.GetParameters();

for (int i = 0; i < pi.Length; i++) {

Console.Write(pi[i].ParameterType.Name + " " + pi[i].Name);

if (i + 1 < pi.Length) Console.Write(", ");

}

Console.WriteLine(")");

}

Console.WriteLine();

Найти подходящий конструктор,

int x;

for (x = 0; x < ci.Length; x++) {

ParameterInfo[] pi = ci[x].GetParameters();

if (pi.Length == 2) break;

}

if (x == ci.Length) {

Console.WriteLine("Подходящий конструктор не найден.");

return;

}

Else

Console.WriteLine("Найден конструктор с двумя параметрами.\n");

Сконструировать объект,

object[] consargs = new object[2];

consargs[0] = 10;

consargs[1] = 20;

object reflectOb = ci[x].Invoke(consargs);

Console.WriteLine("Вызов методов для объекта reflectOb."); Console.WriteLine();

MethodInfo[] mi = t.GetMethods();

Вызвать каждый метод,

foreach (MethodInfo m in mi) {

//• Получить параметры.

ParameterInfo[] pi = m.GetParameters();

if (m.Name.CompareTo("Set") == 0 &&

pi[0].ParameterType == typeof(int)) {

Это метод Set(int, int).

object[] args = new object[2];

args[0] = 9;

args[1] = 18;

m.Invoke(reflectOb, args);

}

else if (m.Name.CompareTo("Set") == 0 &&

pi[0].ParameterType == typeof(double)) {

Это метод Set(double, double).

object[] args = new object[2];

args[0] = 1.12;

args[1] = 23.4;

m.Invoke(reflectOb, args);

}

else if (m.Name.CompareTo("Sum") == 0) {

val = (int)m.Invoke(reflectOb, null);

Console.WriteLine("Сумма равна " + val);

}

else if (m.Name.CompareTo("IsBetween") == 0) {

object[] args = new object[1];

args[0] = 14;

If ((bool)m.Invoke(reflectOb, args))

Console.WriteLine("Значение 14 находится между x и у");

}

else if ( m.Name.CompareTo("Show") == 0) {

m.Invoke(reflectOb, null);

}

}

}

}

 

При выполнении этой программы получается следующий результат.

Найдено: MyClass

Найдено: AnotherClass

Найдено: Demo

 

Использовано: MyClass

 

Доступные конструкторы:

MyClass(Int32 i)

MyClass(Int32 i, Int32 j)

 

Найден конструктор с двумя параметрами.

 

Конструирование класса MyClass(int, int)

Значение х: 10, значение у: 20

 

Вызов методов для объекта reflectOb

 

Сумма равна 30

Значение 14 находится между х и у

В методе Set (int, int) . Значение х: 9, значение у: 18

В методе Set(double, double). Значение х: 1, значение у: 23

Значение х: 1, значение у: 2 3

 

Как следует из результата выполнения приведенной выше программы, обнаружены все три класса, содержащиеся в файле сборки МуСlasses.ехе. Первым среди них обнаружен класс MyClass, который затем был использован для получения экземпляра объекта и вызова соответствующих методов.

Отдельные типы обнаруживаются в сборке MyClasses.ехе с помощью приведенной ниже последовательности кода, находящегося в самом начале методачМаin().

 

// Загрузить сборку MyClasses.exe.

Assembly asm = Assembly.LoadFrom("MyClasses.ехе") ;

 

// Обнаружить типы, содержащиеся в сборке MyClasses.exe.

Туре[] alltypes = asm.GetTypes();

 

Foreach(Type temp in alltypes)

Console.WriteLine("Найдено: " + temp.Name);

 

Этой последовательностью кода можно пользоваться всякий раз, когда требуется динамически загружать и опрашивать сборку.

Но сборка совсем не обязательно должна быть исполняемым файлом с расширением .ехе. Сборки могут быть также в файлах динамически компонуемых библиотек (DLL) с расширением .dll. Так, если скомпилировать исходный файл MyClasses.cs в следующей командной строке:

 

Csc /t:library MyClasses.es

 

то в итоге получится файл MyClasses.dll. Преимущество размещения кода в библиотеке DLL заключается, в частности, в том, что в этом случае метод Main() в исходном коде не нужен, тогда как всем исполняемым файлам требуется определенная точка входа, с которой должно начинаться выполнение программы. Именно поэтому класс Demo содержит метод Main() в качестве такой точки входа. А для библиотеки DLL метод Main() не требуется. Если же класс MyClass нужно превратить в библиотеку DLL, то в вызов метода LoadFrom() придется внести следующее изменение.

 

Assembly asm = Assembly.LoadFrom("MyClasses.dll");

 

 


Дата добавления: 2019-02-12; просмотров: 293; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!