程序目录的整理
想必C#的开发者都遇到过这个问题,引用的dll都放在根目录下,随着项目的日益增大,根目录下充满了各种各样的dll,非常的不美观。如果能够把dll按照想要的目录来存放,那么系统就美观多了
系统搜索dll的目录以及顺序
- 程序的根目录
- 根目录下面,与被引用程序集同名的子目录
- 根目录下面被明确定义为私有目录的子目录
如何让程序识别不同目录下的dll?
“私有目录”
方法一:配置App.config文件的 privatePath
——【推荐】
配置如下,多个目录用;分隔
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8.1" />
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="3rdLib;MyLibs;SubFolder\Sub.dll"/>
</assemblyBinding>
</runtime>
</configuration>
方法二:订阅程序集解析事件 AssemblyResolve
在代码中解析
应用程序集域中支持在程序集解析时的处理: 我们可以在程序集解析时,根据不同的程序集做不用的处理,比如加载x86的程序集还是64位的程序集,当然也就可以指定程序集目录了
这也正是 Assembly.Load
和 Assembly.LoadFrom
等方法的用武之地。
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
AssemblyName assemblyName = new AssemblyName(args.Name);
return Assembly.LoadFrom(Path.Combine(baseDirectory, "3rdLibs"));
}
~~~~~~~~~~~~~~~
引用的DLL比较多的时候,全部的DLL都放在exe同目录下,显得比较乱而且不利于管理。为了更好的管理软件中的各种文件应该分门别类的放入放在子文件夹中。步骤如下:
1、将dll文件放入子文件夹
2、添加引用
解决方案资源管理器中,中 工程名或者“引用”上右键,选中添加引用。
中引用管理器中,点击浏览,选中子文件夹中的dll文件。
3、修改dll文件的引用属性
点击添加成功的引用,将“复制本地”改成false(不然程序运行的时候会将子文件夹下的dll文件复制到根目录中)。
4、添加引用的地址,修改config文件
在根目录中打开“app.config”文件,在<configuration>节点后面添加<runtime>节点再添加下面的节点,其中 probing privatePath 中的地址为子文件的名称。重新生成一下就可以达到预期效果了。指定的目录即为生成exe所在路径的次级dll文件目录。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin/dll;" />
</assemblyBinding>
</runtime>
</configuration>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="bin;bin2\subbin;bin3"/>
</assemblyBinding>
</runtime>
</configuration>
这是最简单的方法,当然也有一定的局限性,就是没法对dll做控制,另外,无法解决第三方DllImprt
中引入的程序集不在根目录下的问题,不过无论怎么说,这个都基本解决了问题。