Компиляция во время выполнения с ссылочными сборками
Я создал функцию для компиляции кода C# в строку в памяти и использовать его во время выполнения. Это работает очень хорошо.
Затем я создал небольшую библиотеку классов (назовем ее mynew.dll) и поместил ее в папку c:\mylibraries\mynew.dll.
В моем коде я могу добавить ссылку на сборку. Я делаю это так:
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters
{
GenerateExecutable = false,
GenerateInMemory = true
};
parameters.ReferencedAssemblies.Add(@"c:\mylibraries\mynew.dll");
CompilerResults results = provider.CompileAssemblyFromSource(parameters, mycode);
Теперь в моей кодовой строке C# (mycode) есть функция с именем "Execute". Когда я объявляю пространство имен и класс из mynew.dll в этой функции, я получаю эту ошибку:
Не удалось загрузить файл или сборку 'MyNew, Version=1.0.0.0, Culture= нейтральный, PublicKeyToken=null' или одну из ее зависимостей. Система не может найти указанный файл.
Когда я копирую dll в папку bin/debug основного приложения, оно внезапно работает, но я этого не хочу. Я хочу, чтобы код, скомпилированный во время выполнения, использовал его, а не основное приложение.
Это я сделал перед публикацией здесь:
- Поиск Stackru
- Используется Google
- Пытался скомпилировать dll на диск, а не в память. Это работает... Проблема сейчас в том, что DLL-библиотека заблокирована в IIS, и я не могу удалить ее без перезапуска сервера IIS; нет варианта, так как код может измениться в любой момент, и я не хочу перезагружать сервер, когда люди находятся на сайте.
Есть ли способ это исправить?
1 ответ
Используйте Directory.GetFiles, чтобы найти свою сборку в файловой системе, используйте System.Reflection.Assembly.LoadFile, чтобы загрузить сборку, а затем найдите требуемые типы. Используйте интерфейс, который будет реализован вашими конкретными классами, чтобы избежать необходимости знать конкретные типы.
Этот поток должен помочь: Поиск объектов, которые реализуют интерфейс из загруженной сборки - как сравнить типы?