У меня есть приложение, которое копирует DLL (UserControlLibrary) в свою собственную папку Debug / Release и загружает ее, используя этот код:
AppDomain appDomain = AppDomain.CreateDomain("MyDomain");
OpenFileDialog dialog = new OpenFileDialog();
dialog.Filter = "DLLs (*.dll)|*.dll";
if (dialog.ShowDialog().Value)
{
string newLocation = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\" + dialog.SafeFileName;
File.Copy(dialog.FileName, newLocation, true);
Assembly assembly = appDomain.Load(AssemblyName.GetAssemblyName(newLocation));
UserControl userControl = (UserControl) assembly.CreateInstance("WpfControlLibrary1.UserControl1");
}
Теперь я добавляю этот UserControl в Grid, используя:
grid.Children.Add(userControl);
Работает нормально. Теперь я пытаюсь выгрузить DLL, используя:
AppDomain.Unload(appDomain);
grid.Children.Clear();
Если я сейчас попытаюсь снова загрузить DLL (потому что она изменилась), используя приведенный выше код, я получаю сообщение об ошибке, сообщающее, что файл используется (File.Copy).
Я много чего прочитал, и я предполагаю, что мне не разрешено использовать UserControl, как я (потому что он загружается в основной домен приложения). Как мне изменить код, чтобы он работал?
Я также много читал об использовании MarshalByRefObject, но, к сожалению, я не смог реализовать его в этом проекте. Пример или модификация приведенного выше кода было бы неплохо.
EDIT:
Из комментариев, которые я читал до сих пор (особенно из svick), похоже, что я должен использовать "AppDomain.CreateInstanceAndUnwrap" вместо "AppDomain.Load".
Я уже видел этот подход при поиске решения ранее, но, как уже упоминал svick, он не работает, потому что UserControl не может наследовать от MarshalByRefObject.
Кто-нибудь знает другой путь?