Загрузка скомпилированной сборки InMemory в текущий домен - PullRequest
4 голосов
/ 11 марта 2011

Я использую CSharpCodeProvider для компиляции сборки, и для свойства CompileParameters GenerateInMemory установлено значение true, потому что я не хочу создавать физический файл.

ПослеЯ могу взять CompilerResults и сделать что-то вроде этого: -

 object x = cr.CompiledAssembly.CreateInstance("MyGeneratedClass");
 Console.WriteLine(x);

Я получаю ожидаемый результат, CreateInstance сработал.

Однако мне нужно иметь возможностьтипы доступа в текущем AppDomain без таких знаний о сборке.Мне нужно сделать что-то вроде этого: -

 Type t = Type.GetType("MyGeneratedClass");
 object x = Activator.CreateInstance(t);

Проблема в этом коде t оказывается нулевым.Теперь я подозреваю, что хотя сборка скомпилирована, она не загружается.Я не могу найти, чтобы загрузить эту сборку в домен, чтобы можно было разрешить имена его типов.

Может ли кто-нибудь просветить меня?

Ответы [ 2 ]

6 голосов
/ 11 марта 2011

Боюсь, это явно невозможно.

Документация для Type.GetType четко гласит:

Если сборка не была сохранена на диск при вызове GetType, метод возвращает значение NULL. GetType не понимает переходные динамические сборки; следовательно, вызов GetType для извлечения типа во временной динамической сборке возвращает ноль.

Вам нужно будет записать сборку на диск, если вы хотите, чтобы она работала так же, как любая обычная сборка.

5 голосов
/ 11 марта 2011

Свойство GenerateInMemory - хитрый прием. Компилятор C # не знает, как записывать в память вашей программы. Это подделка, компилятор просят фактически записать сборку в каталог TEMP. Откуда он загружается в память после успешной компиляции с FileStream в byte [], затем Assembly.Load (byte []). Ознакомьтесь с методом Reflector, Microsoft.CSharp.CSharpCodeGenerator.FromFileBatch ().

Поскольку он в любом случае создает файл, просто не очень заметный, решите свою проблему, просто позволив ему создать файл и загрузив его в AppDomain.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...