当前位置: 首页 > 面试题库 >

热卸载/重新加载应用程序使用的DLL

萧升
2023-03-14
问题内容

我有一个加载DLL来执行处理的特定部分的应用程序

Example : "Application.dll" loading "Process.dll"

Process.dll 使用反射 在运行时动态加载 ,并且未在应用程序中引用。

处理完成后,需要在服务器上重新编译DLL,然后稍后再次加载。
为此,我需要释放它,否则会收到以下消息:“无法将文件“ Process.dll”复制到“ Process.dll”。该进程无法访问文件“
Process.dll”,因为被另一个进程使用。”

因此,问题是:Process.dll在重新加载之前,如何以编程方式从我的应用程序中释放/释放/卸载它。当然,整个过程的重点是 停止应用程序。

编辑1:

提出的解决方案是这样的:

AppDomain newDomain4Process = AppDomain.CreateDomain("newDomain4Process");
Assembly processLibrary = newDomain4Process.Load("Process.dll");
AppDomain.Unload(newDomain4Process);

我仍然遇到的问题 是,尽管我给出了正确的完整路径,但还是得到了FileNotFound Exception。这篇文章的答案也没有达到预期的效果。

编辑2:

这篇文章救了我的命,这是代码:

class ProxyDomain : MarshalByRefObject
    {
        public Assembly GetAssembly(string AssemblyPath)
        {
            try
            {
                return Assembly.LoadFrom(AssemblyPath);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

   ProxyDomain pd = new ProxyDomain();
   Assembly a = pd.GetAssembly(FullDLLPath);

编辑3:
我没有访问AppDomain并通过以前的解决方案将其卸载。当我使用经典的AppDomain
Creation方法时,我感觉到Alexei的警告:AppDomain.Unload“似乎”可以正常工作,但程序集仍处于加载状态(“模块视图”)。因此,由于无法真正有效地卸载DLL,我仍然存在某种问题。


问题答案:

自从我看了已经有一段时间了,但是我很确定您需要创建一个新的AppDomain,然后在其中加载DLL。

原因是您无法自行卸载Assembly,但可以卸载AppDomain包含的Assembly

这是一个CodeProject文章,描述了如何执行此操作:卸载正在运行的Dll



 类似资料:
  • 我试图在Docker中使用Create React App和Node js设置一个开发环境。但当我更改代码时,它不会重新加载更改 通常只使用卷就足够了,但我还添加了:CHOKIDAR\u USEPOLLING=true in ENV,正如create react app官方文档所说,我将代码移到了WSL,因为我在Windows 10上,但仍然是一样的。我用create react app创建了另一

  • 我正在尝试热重新加载Lua模块,但在我的情况下,标准方法似乎不起作用。 我创建了两个简单的示例模块“app.lua”和“test.lua”,其中前一个模块作为应用程序的入口点: 并从后者加载一个函数: 此应用程序在docker容器中运行,该容器构建自Tarantool官方图像。假设我对“test”模块的代码进行了更改,比如,将带有print的行更改为“print(“?”)。重新加载模块的标准方法是

  • 问题内容: 我有一台运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 你可以使用reload内置函数重新加载已导入的模块: 在Python 3中,已移至imp模块。在3.4中,不推荐使用importlib,而在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是你想要的。诸如Django开发服务器

  • 问题内容: 我有一个运行时间较长的Python服务器,并且希望能够在不重新启动服务器的情况下升级服务。最好的方法是什么? 问题答案: 您可以使用reload内置函数(仅适用于Python 3.4+)重新导入已导入的模块: 在Python 3中,已移至模块。在3.4中,imp不推荐使用,而reload在中添加了。当定位到3或更高版本时,在调用reload或导入时参考相应的模块。 我认为这就是您想要的

  • 了解如何创建和管理插件。 创建插件 选择“插件”>“开发”>“创建插件”,该菜单将引导您进入 Adobe I/O 开发者控制台。 有关更多创建、测试、提交插件的入门信息,请参阅 Adobe XD 开发者文档。创建插件 查看和安装插件 要查看可安装的插件,请选择“插件”>“发现插件”,或者单击工具栏上的“插件”图标。此外,单击“发现插件 (+)”图标启动“插件管理器”。 查看和安装插件 在插件管理器

  • 使用 Creative Cloud 桌面应用程序卸载 Creative Cloud 应用程序。 卸载 Creative Cloud 应用程序 如果您不再需要某个应用程序,则必须使用 Adobe Creative Cloud 桌面应用程序卸载该应用程序。 注意:不要将应用程序文件和文件夹拖到“废纸篓”或“回收站”中,因为这样做无法将其正确卸载。 单击位于任务栏 (Windows) 或 Apple 菜