加载和替换DLL应用程序

本文关键字:应用程序 DLL 替换 加载 | 更新日期: 2023-09-27 17:50:37

我有WPF应用程序AppTest.

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

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

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

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

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

加载和替换DLL应用程序

一旦Dll被加载到AppDomain中,它就不能被卸载,除非卸载整个AppDomain。您不能释放主AppDomain,因为它拥有正在执行的应用程序。解决方案是创建一个新的AppDomain并将dll加载到其中。当你完成它时,你可以卸载第二个AppDomain,这将释放对dll的锁。

在c#中使用AppDomain动态加载和卸载dll

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

        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