zoukankan      html  css  js  c++  java
  • C#如何加载程序运行目录外的程序集 (转)

    ---恢复内容开始---

    尼玛,为了这个问题,纠结到差点吐出干血,赶紧记下来!

    源地址:http://blog.csdn.net/dyllove98/article/details/9391325

    我们的应用程序部署的时候,目录结构一般不会只有运行程序的目录这一个,我们可能在运行目录下建子目录,也可能使用System32目录,也可能使用其它第三方的程序集。.Net程序集

    首先会在GAC中搜索相应的版本,如果未找到则会应用程序配置文件中找(如果配置),最后到应用程序所在的路径搜索。

    如何可以将程序集部署的运行目录的子目录, 在app.config添加以下配置,其中probing的privatePath就是配置当前程序搜索的子目录

     <configuration>
    ... ... <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <probing privatePath="Plugins;Libs"/> </assemblyBinding> </runtime> </configuration>


    当然我们也可以更详细的配置,不过似乎一般这么用的很少,这里可以指定程序集名称、公钥、文化,版本重定向等等信息

    <configuration>
       <runtime>
          <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
             <dependentAssembly>
                <assemblyIdentity name="myAssembly"
                                  publicKeyToken="32ab4ba45e0a69a1"
                                  culture="neutral" />
                <bindingRedirect oldVersion="1.0.0.0"
                                 newVersion="2.0.0.0"/>
                <codeBase version="2.0.0.0"
                          href="http://www.litwareinc.com/myAssembly.dll"/>
             </dependentAssembly>
          </assemblyBinding>
       </runtime>
    </configuration>

    Msdn地址:http://msdn.microsoft.com/zh-cn/library/twy1dw1e(v=vs.80).aspx

    如何加载非运行目录的程序集?也许有的人会想到反射,的确对应单独的一个程序集我们可以直接调用使用 Assembly.LoadFile(@"XXX.dll");加载,再使用反射对其中的方法属性进行调

    用,但是如果这个程序集同时引用了其它的,非应用程序运行目录下的程序集,这时就会出错,这个问题该如何解决呢?

    我曾尝试用 Assembly.LoadFile(@"XXX.dll");加载那些依赖的程序集,但是没有成功,调用继续出错。使用 AppDomain.CurrentDomain.GetAssemblies()查看,所有的应用程序集都已经加载到了当前应用程序域,但是为什么还是找不到依赖的哪些程序集呢?后来查询未果,希望有高人能回答下。

    最后使用了AppDomain.CurrentDomain.AssemblyResolve事件解决了以上问题,希望遇到同样问题的同学们少走弯路,在程序初始化的时候添加监听事件

                AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

    在监听的事件中遇到要加载额外的dll的时候,返回 Assembly.LoadFrom(strTempAssmbPath)即可

            Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
            {
                var strTempAssmbPath = "";
                if ("qrcsharp" == args.Name.Substring(0, args.Name.IndexOf(",")))
                {
                    var systemFolder = Environment.GetFolderPath(Environment.SpecialFolder.System);
                    strTempAssmbPath = System.IO.Path.Combine(systemFolder, "qrcsharp.dll");
                }
                return string.IsNullOrWhiteSpace(strTempAssmbPath) ? null : Assembly.LoadFrom(strTempAssmbPath);
            }


     

    ---恢复内容结束---

  • 相关阅读:
    cookie
    iOS本地推送
    2020-06-17:红锁的设计思想?
    2020-06-16:Redis hgetall时间复杂度?
    2020-06-15:Redis分布式锁怎么解锁?
    2020-06-14:Redis怎么实现分布式锁?
    2020-06-13:Redis底层数据结构?
    2020-06-12:推箱子自动求解。
    2020-06-11:Redis支持的数据类型?
    2020-06-10:给定一个无序数组,里面数都是成双数的,只有一个数是成单数的,求这个数? 来自
  • 原文地址:https://www.cnblogs.com/yaoxing92/p/4847479.html
Copyright © 2011-2022 走看看