zoukankan      html  css  js  c++  java
  • C#.Net 如何动态加载与卸载程序集(.dll或者.exe)6-----在不卸载程序域的前提下替换程序集文件。

    当某个程序集文件被载入AppDomain,该文件在AppDomain.Unload之前是不能被替换和删除的。
    使用AppDomainSetup的影像复制功能可以实现在不卸载程序的情况下替换或者删除程序集文件。

    AppDomain domain = AppDomain.CreateDomain("a");
    domain.ExecuteAssembly(@"loads est.exe");
    File.Delete(@"loads est.exe");


    上述代码没有在删除文件前调用 AppDomain.Unload(domain); ,所以会出现"拒绝访问"的异常。
    接下来我们打开影像复制功能,你会发现目标程序集文件被正确删除。

    AppDomain domain = AppDomain.CreateDomain("a");

    // 打开影像复制。
    domain.SetShadowCopyFiles();
    // 设置要进行影像设置的程序集路经。
    domain.SetShadowCopyPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "loads"));

    domain.ExecuteAssembly(@"loads est.exe");
    File.Delete(@"loads est.exe");


    我们在"loads est.exe"中使用"Assembly.GetExecutingAssembly().Location"查看,你会发现程序集文件被复制到"c:documents and settingsuser1local settingsapplication dataassemblydl26e9nkvqy.yoldhp83obd.j9j9730b8d10fb5179_6d04c601 est.exe"这样一个目录中,这也是程序集被正确删除的根本原因(^_^)。正因为目标程序集的位置发生变化,因此我们要做更进一步的设置,否则目标程序集在加载动态引用或者读取配置文件时出错。

    AppDomainSetup setup = new AppDomainSetup();
    setup.ApplicationBase = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "loads");
    setup.ConfigurationFile = Path.Combine(setup.ApplicationBase, "test.exe.config");
    setup.ShadowCopyFiles = "true";
    setup.ShadowCopyDirectories = setup.ApplicationBase;

    AppDomain domain = AppDomain.CreateDomain("a", null, setup);
    domain.ExecuteAssembly(@"loads est.exe");

    File.Delete(@"loads est.exe");


    ok, 这回没问题了。

  • 相关阅读:
    python基础——dict和set(字典和集合)
    python基础——循环(for,while,break,continue)
    python基础——条件判断
    python基础——list和tuple(列表和元组)
    python基础——字符串、编码、格式化
    Linux 新建线程 简单使用
    Android 原始套接字
    QTextEdit/QPlainTextEdit 等_默认的滚动条_宽度调节
    494. Target Sum
    670. Maximum Swap
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/5563524.html
Copyright © 2011-2022 走看看