• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Динамическая компиляция и вызов из сборки

  • Автор темы Guest
  • Дата начала
G

Guest

Доброе время суток.
Хотелось бы реализовать динамическую компиляцию, но столкнулся с проблемой.
Руководствовался и темами. Суть проблемы вот в чем - при запуске метода из dll не проходит преобразование типа, более того, складывается ощущение, что это совсем другие классы.
Вот так я подгружаю dll и запускаю метод Run
Код:
Assembly assembly = Assembly.LoadFile(fn);
Type type = assembly.GetType("TestInvoke.Runner");
MethodInfo method = type.GetMethod("Run");

ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
object r = ctor.Invoke(null);

object[] param = { new Class01() };

try
{
method.Invoke(r, param); // вызов метода с входным параметром
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Код:
class Class0 { ... }
class Class01 : Class0 { ... }

Exception: Невозможно преобразовать объект типа "TestInvoke.Class01" к типу "TestInvoke.Class0".

Вот проектик -
 
L

LuMee

Проблема вот в этой строке:
Код:
object[] param = { new Class01() };
Здесь Class01 - это класс из сборки TestInvoke.exe, получаемый при компиляции проекта, а не тот Class01, который вы скомпилировали динамически. По сути, вы получаете два комплекта классов с одинаковыми именами, живущими при этом в разных сборках и, с точки зрения CLR, не имеющими ничего общего между собой.
Работать будет, скажем, так:
Код:
//object[] param = { new Class01() };
object c01 = Activator.CreateInstance(assembly.GetType("TestInvoke.Class01"));
object[] param = { c01 };
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!