zoukankan      html  css  js  c++  java
  • Assembly.Load动态加载程序集而不占用文件 z

    方式一:占用文件的加载

    Assembly assembly = Assembly.Load(path);
    用上面的方法可以动态的加载到dll,但是用这种方法加载到的dll一直到程序运行结束都是占用的dll文件,在此期间不能够对dll文件进行升级,或者修改.

    方式二:不占用文件的方式

    Assembly ab = Assembly.Load(File.ReadAllBytes(path)); 

    首先把dll加载到内存中,然后在在加载成Assembly ,这样的话,dll完全跟程序解耦了,只要加载完成,你就是把dll给删除了,程序也一样照常运行。

    有时候,需要将被引用的程序集放到单独的目录统一维护(如更新等),提供给多个项目使用到这些程序集。

    我们知道,项目在添加了对程序集的引用后,编译时通常会将引用的程序集一起生成到bin或release目录。现在为了统一管理,我们把这些要引用的程序 集放到一个公共的目录,供多个项目使用,同时我们移除掉bin或release目录下的这些dll文件。默认情况下,程序运行过程中需要加载一个程序集, 会先后从系统目录和程序运行目录查找要加载的dll文件,如果都没有查找到,将会抛出一个异 常:System.IO.FileNotFoundException: 未能加载文件或程序集“Accessibility, Version=x.x.x.x, Culture=neutral, PublicKeyToken=xxxxxx”或它的某一个依赖项。系统找不到指定的文件。

    现在我们通过注册AppDomain.CurrentDomain.AssemblyResolve事件,在事件处理程序中根据args.Name和我们指定的目录重新构建dll文件路径,加载程序集并返回。这样实现在程序集加载不成功的情况下,转到我们指定的目录加载程序集。

    以下代码即实现运行时控制从指定路径加载dll:

    static void Main(string[] args)
    {
         AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;    
    }

    static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
    {
         string module = new AssemblyName(args.Name).Name;
         string dll = Path.Combine("d:\AssemblyDir",string.Format("{0}.dll",module));
         return Assembly.LoadFrom(dll);
    }

  • 相关阅读:
    Oracle EBS-SQL (INV-1):库存货位列表.sql
    Oracle EBS-SQL (SYS-24):职责列表
    Oracle EBS-SQL (SYS-23):用户权限查询.sql
    Oracle EBS-SQL (SYS-22):sysadmin_用户职责查询.sql
    Oracle EBS-SQL (SYS-21):sys_用户名与人员对应关系查询.sql
    Oracle EBS-SQL (SYS-20):职责使用菜单2.sql
    Oracle EBS-SQL (SYS-20):OPM接口处理.sql
    Oracle EBS-SQL (SYS-19):sys-用户登陆纪录查询.sql
    Oracle EBS-SQL (SYS-18):检查系统安装的各个表是否打开(PJM%).sql
    Oracle EBS-SQL (SYS-17):查询一张报表在哪个职责下面.sql
  • 原文地址:https://www.cnblogs.com/zeroone/p/4716066.html
Copyright © 2011-2022 走看看