系列文章 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-白癜风治疗最好的医院白癜风怎么治疗
|