gpt4 book ai didi

c# - 加载 DLL 创建实例并卸载

转载 作者:行者123 更新时间:2023-11-30 12:15:38 24 4
gpt4 key购买 nike

我有一个应用程序将 DLL (UserControlLibrary) 复制到它自己的调试/发布文件夹并使用此代码加载它:

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.Children.Add(userControl);

工作正常。现在我尝试使用以下方法卸载 DLL:

AppDomain.Unload(appDomain);
grid.Children.Clear();

如果我现在尝试使用上面的代码再次加载 DLL(因为它同时发生了变化),我会收到一条错误消息,告诉我文件正在使用中 (File.Copy)。

我读了很多东西,我的猜测是不允许我像以前那样使用 UserControl(因为它加载到 Main AppDomain 中)。我必须如何更改代码才能使其正常工作?

我也阅读了很多关于使用 MarshalByRefObject 的内容,但不幸的是我无法在这个项目中实现它。上面代码的示例或修改会很好。

编辑:

从我目前阅读的评论(尤其是来自 svick 的评论)来看,我似乎必须使用“AppDomain.CreateInstanceAndUnwrap”而不是“AppDomain.Load”。我在早些时候搜索解决方案时已经看到了这种方法,但正如 svick 所提到的那样,它不起作用,因为 UserControl 无法从 MarshalByRefObject 继承。

有人知道其他方法吗?

最佳答案

阅读the documentation for AppDomain.Load() .它特别指出,此方法将程序集同时 加载到您调用该方法的程序集和当前程序集中。因此,即使您卸载了应用程序域,该程序集仍会在当前程序集中保持加载状态。

我不确定是否有解决此问题的方法,因为您不能使 UserControl 继承自 MarhshalByRefObject

关于c# - 加载 DLL 创建实例并卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7034130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com