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

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

Guest

#1
Доброе время суток.
Хотелось бы реализовать динамическую компиляцию, но столкнулся с проблемой.
Руководствовался этой и этой темами. Суть проблемы вот в чем - при запуске метода из 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".

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

LuMee

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