Замена DLL во время использования

Я создаю систему типа плагинов, где каждый плагин представлен в виде DLL. Я хотел бы иметь возможность перезагружать их, не останавливая основное приложение. Это означает, что они должны быть загружены во время выполнения, без предварительно построенных связей между ними (выполните поиск файлов для dll и загрузите их). Я установил это с помощью Assembly.LoadFile(filename), однако, когда я пытаюсь использовать File.Copyдля замены DLL, он выдает исключение, говоря что-то похожее на «файл в использовании'. Я пытался использовать AppDomain, загружать все плагины через этот вторичный домен и выгружать его перед повторной загрузкой, но это вызывает то же исключение.

Мой текущий код:

        if (pluginAppDomain != null)
            AppDomain.Unload(pluginAppDomain);
        foreach (string s in Directory.GetFiles(path_to_new_DLLs))
        {
            string name = s.Substring(s.LastIndexOf('\\') + 1);
            Console.WriteLine("Copying " + name);
            File.Copy(s, Path.Combine(current_directory, name), true); // Throws exception here
        }
        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationBase = Environment.CurrentDirectory;
        setup.ShadowCopyFiles = "true"; 
        // I think this is where the problem is, maybe I'm forgetting to set something
        pluginAppDomain = AppDomain.CreateDomain("KhybotPlugin", null, setup);
        foreach (String s in Directory.GetFiles(Environment.CurrentDirectory, "*.dll"))
        {
            int pos = s.LastIndexOf('\\') + 1;
            Assembly dll = pluginAppDomain.Load(s.Substring(pos, s.Length - pos - 4));
            // Elided... Load types from DLL, etc, etc
        }
6
задан 2 April 2012 в 16:27
поделиться