时间:2016-10-31来源:本站原创作者:佚名
系列文章

c#开发奇技淫巧一:调试windows系统服务

c#开发奇技淫巧二:根据dll文件加载C++或者Delphi插件

c#开发奇技淫巧三:把dll放在不同的目录让你的程序更整洁

程序目录的整理

想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观。

如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用的程序各文件的分布:

NLog.dll

Newtonsoft.Json.dll

……

Excecutable.exe

Excecuteble.exe.config

网上有很多的文章述说这个,比如使用Assembly.Load,但是没有说明在程序中怎么使用,也没有给出具体的代码。这里我结合自己多年的实践经验,再把整个流程和方法详细叙述一遍,以便各位看官有个具体的体会。

系统搜索dll的目录以及顺序

CLR解析一个程序集会在一个根目录内进行搜索,整个探索过程又称Probing,这个根目录很显然就是当前包含当前程序集的目录。

AppDomainSetup这个类存储着探索目录的信息,其成员包括:ApplicationBase、PrivateBinPath。

程序搜索dll的顺序如下(区分强名称签名的和没有强名称签名的程序集):

没有做强名称签名的程序集:

程序的根目录

根目录下面,与被引用程序集同名的子目录

根目录下面被明确定义为私有目录的子目录

在目录中查找的时候,如果dll查找不到,则会尝试查找同名的exe

如果程序集带有区域性,而不是语言中立的,则还会尝试查找以语言区域命名的子目录

具有强名称签名的程序集:

全局程序集缓存

如果有定义codebase,则以codebase定义为准,如果codebase指定的路径找不到,则直接报告错误

程序的根目录

根目录下面,与被引用程序集同名的子目录

根目录下面被明确定义为私有目录的子目录

在目录中查找的时候,如果dll查找不到,则会尝试查找同名的exe

如果程序集带有区域性,而不是语言中立的,则还会尝试查找以语言区域命名的子目录

如何让程序识别不同目录下的dll?

我们看到,上面的顺序无论是否有强名称签名看,都提到了一个名词“私有目录”

方法一:配置App.config文件的privatePath——

这是最简单的方法,当然也有一定的局限性,就是没法对dll做控制,另外,无法解决第三方DllImprt中引入的程序集不在根目录下的问题,不过无论怎么说,这个都基本解决了问题。

配置如下,多个目录用;分隔

runtime  assemblyBindingxmlns=urn:schemas-microsoft-







































白癜风治疗最好的医院
白癜风怎么治疗

转载请注明原文网址:http://www.helimiaopu.com/cxkf/1206.html

------分隔线----------------------------