У меня есть ситуация здесь в проекте .net, в котором я компилирую скрипты C # в сборки в памяти, используя CodeDomProvider.
В классе CompilerParameters, который я использую для компиляции, я ссылаюсь на некоторые сборки по названию (System.dll и та, которая является частью проекта), и пока все работает.Однако некоторые сценарии используют некоторый код (через интерфейс и полиморфизм), который находится в сборке, которая предварительно скомпилирована, но загружается динамически с диска (например, в виде плагина).В этой ситуации это не будет работать, и проблема в том, что я не знаю, как ссылаться на динамически загруженную сборку при динамической компиляции скрипта.
Если я помещаю свой скрипт в библиотеку классов и из этой библиотеки классов я ссылаюсь на сборку плагина, все работает нормально, но если я добавлю имя сборки плагина (файл dll)к ссылочным сборкам в CompilerParameters и динамической компиляции сценария впоследствии, сценарий выполняется, а код, который находится в dll плагина, - нет.
Надеюсь, понятно, что я пытаюсь сделать здесь, пожалуйста, помогите, если вы знаете что-нибудь об этом, потому что я борюсь в течение некоторого времени и ничего, что я пробовал, не работает.
Спасибо!
Редактировать: Вот код для загрузки dll плагина:
DirectoryInfo di = new DirectoryInfo(@".\Plugins");
FileInfo[] files = di.GetFiles("*.dll");
foreach (FileInfo fi in files)
{
try
{
//load all dll files from the app pack directory
Assembly asm = Assembly.LoadFrom(fi.FullName);
Assemblies.Add(asm);
foreach (Type type in asm.GetTypes())
{
try
{
object instance = null;
instance = Activator.CreateInstance(type);
После этого я сохраняю экземпляр в словаре для дальнейшего использования.С другой стороны, вот как я пытаюсь передать ссылки на сценарий, который будет скомпилирован:
CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
List<string> referenceAssemblies = new List<string>();
referenceAssemblies.Add("System.dll");
referenceAssemblies.Add("VFS.dll");
foreach (Assembly asm in PluginManager.Instance.Assemblies)
{
referenceAssemblies.Add(asm.Location);
}
CompilerParameters compilerParameters = new CompilerParameters(referenceAssemblies.ToArray());
Это работает, если я не использую какой-либо класс, который является частью плагина.