Загрузить сборку 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!