C#如何加载程序运行目录外的程序集

摘要:
C#如何在运行目录外加载程序集在部署应用程序时,我们通常不只有运行程序的目录结构。我们可以在运行目录下创建子目录,或者使用System32目录,或者其他第三方程序集。Net程序集将首先在GAC中搜索相应的版本,如果没有,它将在应用程序配置文件中找到它(如果已配置),最后搜索应用程序所在的路径。如何将以下配置添加到app.config中部署程序集的运行目录的子目录

C#如何加载程序运行目录外的程序集

我们的应用程序部署的时候,目录结构一般不会只有运行程序的目录这一个,我们可能在运行目录下建子目录,也可能使用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);
        }
复制代码


 

 
 
分类: C#

免责声明:文章转载自《C#如何加载程序运行目录外的程序集》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇如何预测股票分析--先知(Prophet)vs2015编译ffmpeg 出现错误rtmp.lib(rtmp.obj) : error LNK2001: 无法解析的外部符号 ___iob_func下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

postgresql笔记

一旦任何有价值的对象被转移到新所有者,可以使用DROPOWNED命令删除被删除角色所拥有的任何剩余对象。此外,DROPOWNED不会删除整个数据库或表空间。因此,如果角色有任何尚未转移到新所有者的数据库或表空间,则需要手动删除它们。DROPOWNED还将注意到,对于不属于目标角色的对象,删除授予目标角色的任何特权。因为REASSIGNOWNED不会接触这些对...

面试了一个 31岁的iOS开发者,思绪万千,30岁以上的程序员还有哪些出路?

前言之前HR给了我一份简历,刚看到简历的第一眼,31岁?31岁,iOS开发工程师,工作经历7年,5年左右都在外包公司,2年左右在创业公司。iOS开发工程师这块,还是很少遇到30岁以上的开发,正好,来了一个30岁的开发,说实话,对我来说,还是蛮期待的,希望对我有所启示。这样的过程持续了半个小时那么年过350岁的程序员还有出路吗?作为一个8年的iOS开发,而且几...

axios 学习文档

Axios是一个基于承诺的HTTP库,可以在浏览器和node.js中使用。执行POST请求axis.POST.then。接住执行多个并发请求函数getUserAccount(){returnaxios.get;}函数getUserPermissions(){returnaxios.get;}全部承诺。然后axios API可以通过传递相关配置来请求axios...

PX4 飞控源码系统框架介绍

该部分主要是PX4系统的使用的所有的数据结构的集合部分,各种任务和sensor驱动中需要获取的sensor数据都在此部分,还包含各种运行状态的数据结构。...

plsql 导出查询结果

单击青色按钮,表示所查询的所有数据都将导出到指定文件,而不仅仅是以下列表中显示的数据行;无需单击“获取最后一页”按钮。注意:选择导出到excel文件时,需要注意默认导出为*。xlsx格式。您可以选择*。xls格式,但*。xls格式只能容纳65536行数据。如果要导出的数据超过最大值,则必须更改为*。xlsx格式!如果您仍然使用此格式,后面的数据将覆盖以前的数...