加载并替换dll应用程序

时间:2015-05-25 15:18:11

标签: c# wpf dll garbage-collection

我有WPF应用程序AppTest。

DllMaster1 - 这只是一个带控件的窗口。

在主应用程序中引用类库DllMaster1。

Window app = new DllMaster1.MainWindow();
app.ShowDialog();
app = null;
GC.Collect();

现在我需要从内存中删除一个对象,以便我可以用另一个替换他,因为当我想要替换DllMaster1时,我收到消息:

  

无法完成操作,因为文件夹或其中的文件是   在另一个程序中打开。

2 个答案:

答案 0 :(得分:0)

将Dll加载到AppDomain后,如果不卸载整个AppDomain,则无法卸载它。您无法释放主AppDomain,因为它是拥有正在执行的应用程序的AppDomain。解决方案是创建一个新的AppDomain并在其中加载dll。完成后,您可以卸载第二个AppDomain,它将释放dll上的锁。

您可以在此处找到代码:Using AppDomain in C# to dynamically load and unload dll

请记住,这不是一件简单的事情;有很多复杂性,微妙的行为可能会导致一些非常有趣的错误。

答案 1 :(得分:0)

        AppDomain appDomain = AppDomain.CreateDomain("appDomain");
        Assembly a = appDomain.Load("DllMaster1");
        Type myType = a.GetType("DllMaster1.MainWindow");
        MethodInfo myMethod = myType.GetMethod("MyMethod");
        object obj = Activator.CreateInstance(myType);
        myMethod.Invoke(obj, null);
        AppDomain.Unload(appDomain);

MyMethod是DllMaster1 this.Show();中的新方法。卸载不起作用,我仍然无法删除DLL。