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

Тема в разделе ".NET", создана пользователем -, 14 июн 2011.

  1. Гость

    Доброе время суток.
    Хотелось бы реализовать динамическую компиляцию, но столкнулся с проблемой.
    Руководствовался этой и этой темами. Суть проблемы вот в чем - при запуске метода из dll не проходит преобразование типа, более того, складывается ощущение, что это совсем другие классы.
    Вот так я подгружаю dll и запускаю метод Run
    Код (Text):
    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);
    }
    Код (Text):
    class Class0 { ... }
    class Class01 : Class0 { ... }
    Exception: Невозможно преобразовать объект типа "TestInvoke.Class01" к типу "TestInvoke.Class0".

    Вот проектик - http://depositfiles.com/files/0wbgghvr7
     
  2. LuMee

    LuMee Well-Known Member

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

Поделиться этой страницей