系列文章
程序目录的整理想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观。 如果能够把dll按照想要的目录来存放,那么系统就美观多了,以下是我常用的程序各文件的分布:
网上有很多的文章述说这个,比如使用Assembly.Load,但是没有说明在程序中怎么使用,也没有给出具体的代码。这里我结合自己多年的实践经验,再把整个流程和方法详细叙述一遍,以便各位看官有个具体的体会。 系统搜索dll的目录以及顺序CLR解析一个程序集会在一个根目录内进行搜索,整个探索过程又称Probing,这个根目录很显然就是当前包含当前程序集的目录。 AppDomainSetup这个类存储着探索目录的信息,其成员包括: 程序搜索dll的顺序如下(区分强名称签名的和没有强名称签名的程序集): 没有做强名称签名的程序集:
具有强名称签名的程序集:
如何让程序识别不同目录下的dll?我们看到,上面的顺序无论是否有强名称签名看,都提到了一个名词 “私有目录” 方法一:配置App.config文件的
这是最简单的方法,当然也有一定的局限性,就是没法对dll做控制,另外,无法解决第三方 配置如下,多个目录用;分隔 runtime> assemblyBinding xmlns='urn:schemas-microsoft-com:asm.v1'> probing privatePath='3rdLib;MyLibs;SubFolder\Sub.dll'/> assemblyBinding>runtime> 方法二:订阅程序集解析事件
应用程序集域中支持在程序集解析时的处理:
这也正是 Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args){ AssemblyName assemblyName = new AssemblyName(args.Name); return Assembly.LoadFrom(Path.Combine(baseDirectory, '3rdLibs'));} 方法三:在加载使用到dll的代码之前设置重置当前环境的目录
这个方法就是通过 这是一个 取巧 的方法,不是很实用,要来回切换程序集目录,但是在某些情况下非常好用 如何处理 自己写
如果是自己写,那么久好控制了,可以直接指定相对的目录 引用的C#的插件又使用了
这是很多文章都没有提及的:因为无法更改路径,那么只能够使用上述特殊的方法,更改当前程序的路径 当然,还有更省事一点的做法,就是在系统环境中,增加一条记录,指向要加载的dll的所在目录。因为C++的代码中,Windows目录和Windows\System32目录以及环境变量设定的目录都是搜索路径之一。
这里提供怎么从C#中修改系统环境变量的代码: static void AddEnvironmentPaths(IEnumerablestring> paths){ var path = new[] { Environment.GetEnvironmentVariable('PATH') ?? string.Empty }; string newPath = string.Join(Path.PathSeparator.ToString(), path.Concat(paths)); Environment.SetEnvironmentVariable('PATH', newPath);} |
|
来自: 昵称39616662 > 《WINFORM》