zoukankan      html  css  js  c++  java
  • 在同个应用程序中不关闭程序实现动态加载同个DLL多次,且DLL内容有更新,程序不会认为是同个DLL

    在同个应用程序中不关闭程序实现动态加载同个DLL多次,且DLL内容有更新,程序不会认为是同个DLL

    最近做个项目,需要挂载DLL,在DLL更新后不能立刻关闭旧的DLL,因为DLL是一系列的WCF服务。在这种情况下就需要实现动态挂载和卸载DLL,但是一个应用程序在不关闭的情况下只能加载同个DLL一次。

    入正题:

    private void GetSevList(string dllPath, string sevUri)
    {
      //创建程序域
      AppDomainSetup setup = new AppDomainSetup();   ProxyObject po = new ProxyObject();   setup.LoaderOptimization = LoaderOptimization.SingleDomain;   setup.ApplicationName = "Test";   setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;   setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private");   setup.CachePath = setup.ApplicationBase;   setup.ShadowCopyFiles = "true";   setup.ShadowCopyDirectories = setup.ApplicationBase;
      //使用指定的名称、证据和应用程序域设置信息创建新的应用程序域。(sevUri 是一个文本值 不重复)   AppDomain domain = AppDomain.CreateDomain(sevUri.Split('/')[sevUri.Split('/').Length - 1], null, setup);
      string name = Assembly.GetExecutingAssembly().GetName().FullName;
      //加载DLL(这个就是需要多次加载的那个DLL)   Assembly MyAssembly = po.LoadAssembly(dllPath);   po = (ProxyObject)domain.CreateInstanceAndUnwrap(name, typeof(ProxyObject).FullName);
      
      
      Assembly[] abs = AppDomain.CurrentDomain.GetAssemblies();
    }

    class ProxyObject : MarshalByRefObject
    {
      Assembly assembly = null;
      public Assembly LoadAssembly(string dllPath)
      {
        assembly = Assembly.LoadFile(dllPath);
        return assembly;
      }
     
      public string FullName
      {
        get { return assembly.FullName; }
      }   
    }
    ------------付截图--------------


    转载说明出处
  • 相关阅读:
    .NET实现Excel文件的读写 未测试
    权限管理设计
    struts1中配置应用
    POJ 2139 Six Degrees of Cowvin Bacon(floyd)
    POJ 1751 Highways
    POJ 1698 Alice's Chance
    POJ 1018 Communication System
    POJ 1050 To the Max
    POJ 1002 4873279
    POJ 3084 Panic Room
  • 原文地址:https://www.cnblogs.com/weivyuan/p/2738919.html
Copyright © 2011-2022 走看看