.Net的WinForm程序有的时候让人很烦的是,在执行目录下总是一大堆的DLL,配置文件,最少则是个以下,多的时候怕有四五十个吧……,自己程序中的类库,第三方的类库……加载一起让人感觉乱糟糟的,非常不爽。在下虽然在个人卫生上没有什么洁癖,可是对于应用程序的这个样子确实没有一点容忍力的,是可忍孰不可忍啊!
处理这些DLL还是比较简单的,Configuration文件里就可以配置了。先将DLL分门别类,Core, Module, Misc等等,然后将这几个目录名称加入App.config中。如:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="Castle;Core;Module;UI;Misc;"/>
</assemblyBinding>
</runtime>
嗯,现在看上去就舒服多了,各就各位的,清爽!慢……在主目录下,出了我们的应用程序Exe可执行文件外,还有一个例外,app.config…… 多少还是有点儿不爽,怎么办呢?我们建个Data目录,将config文件移动进去吧~!说做就做,我们就把app.config移动到下级目录了,开心啊,看看程序能运行不? 杯具发生了,程序运行毫无反应…… 用VS调试之,发现是找不到其他类库中的类型导致的。也是,我们刚刚在config文件中加了privatePath,现在有把这个文件移动了,怎么能加载到其他目录下的DLL呢?
知道原因了,当然就好解决。据说configuration文件的位置是可以指定的。AppDomainSetup.ConfiguraitonFile属性就是指的这个。让我们来试试……
分析一下:
要改config的路径,当然是要在使用config之前咯,而且越早越好…… 哪里比较早呢?嗯,Main函数,程序的入口是个不错的选择……
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
AppDomain.CurrentDomain.SetupInformation.ConfigurationFile = "Data\MyApp.Config";
Application.Run(new MyAppForm());
}
}
好,编译,信心满满的再次运行程序,可是杯具再一次啊发生了,依然没有反应……
……在此调试,惊奇的发现这个属性设置居然完全没有效果,语句执行完后,该属性值依然是默认值。于是查文档啊,百度啊,谷歌啊~ 最后终于知道设置config的正确方法。
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
嗯,这个这个……不是微软在害人吗…… 好了,停下抱怨继续工作先…… 嗯,看到了,config文件的位置生效了,指向了我们预定的位置,可是………… 杯具毫无意外的再次发生……DLL依然不能加载!
虽然我已经在AppDomainSetup里看到了PrivateBinPath属性,可是我却一点兴奋感觉都没有,应该跟前面的结果类似把!
想想程序运行的过程,PrivateBinPath是AppDomain.Current.SetupInformation里的属性,而这个属性只有在AppDomain.Create的时候才会生效,在AppDomain已经建立后更改config的路径再去设置这个值,应该是不行的。看来只好代码里来设置了。可是如何下手呢?
关门, 放Reflector!呵呵,让我们看看AppDomain内部的情况。果其不然啊!SetupInforamtion只是其内部配置的一个Copy,这也就解释了为什么更改属性却没有生效的原因!
public AppDomainSetup SetupInformation
{
get
{
return new AppDomainSetup(this.FusionStore, true);
}
}
看起来不动用终极手段是不行的了!反射!更改内部字段来达到我们的目的!仔细检查了以下代码,发现AppDomain内部的Setup信息是保存在一个FunsionStore的Internal属性里的。好,我们就从这里动手把!
AppDomain.CurrentDomain.SetData("PRIVATE_BINPATH", "Castle;Core;Module;UI;Misc;");
AppDomain.CurrentDomain.SetData("BINPATH_PROBE_ONLY", "Castle;Core;Module;UI;Misc;");
这段代码确实就更改了AppDomain.CurrentDomain.SetupInformation.PrivateBinPath的值了,可是运行发现类型还是不能加载!可能内部还有个什么RefrefshConfiguraiton或UpdateCache之类的方法来刷新!继续找啊找的~ 终于发现了。是一个static extern的方法。呵呵……这下简单了,看代码!
在调试过程中,我们还发现Main方法不是最好的地方,所以我们将代码放在了Program的静态构造方法中,这里是除了静态字段外的最早的起始地了。
static Program()
{
AppDomain.CurrentDomain.SetData("PRIVATE_BINPATH", "Castle;Core;Module;UI;Misc;");
AppDomain.CurrentDomain.SetData("BINPATH_PROBE_ONLY", "Castle;Core;Module;UI;Misc;");
var m = typeof(AppDomainSetup).GetMethod("UpdateContextProperty", BindingFlags.NonPublic | BindingFlags.Static);
var funsion = typeof(AppDomain).GetMethod("GetFusionContext", BindingFlags.NonPublic | BindingFlags.Instance);
m.Invoke(null, new object[] { funsion.Invoke(AppDomain.CurrentDomain, null), "PRIVATE_BINPATH", "Castle;Core;Module;UI;Misc;" });
}
嗯,迫不及待的编译,运行!哇!毫不意外的,程序正常了,再看看应用程序目录,只有一个干干净净的exe文件的存在,真是爽到极点~
告诉你,exe文件就一个,我可以!哈哈!
最后提醒,如果Program里有静态字段,不要定义为用其他类库的类型,因为这个时候我们上述的方法还没有执行到,会因为找不到类型而出错的哦~
原文:
http://www.cnblogs.com/NullReference/archive/2010/02/09/Set_AppDomain_PrivateBinPath_and_ConfigurationFile_Location.html
分享到:
相关推荐
Configuration File Not Found(解决方案).md
configuration file
来自: ... Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。
tmux configuration file
在"vim configuration file"这个主题中,我们将深入探讨Vim配置文件的重要性、基本结构以及如何利用它提升工作效率。 1. **配置文件的重要性** - **个性化体验**:每个人的编程习惯不同,通过.vimrc文件,用户可以...
configuration file for zos 1.09
这个配置文件`.ycm_extra_conf.py`是YCM插件的核心组成部分,它允许用户自定义代码补全的规则和行为。 在深入讨论`.ycm_extra_conf.py`之前,我们先来了解下Vim和YouCompleteMe的基本概念。Vim是一个非常流行的文本...
在 "ConfigurationFile.ini" 中,你可以定义 SQL Server 安装时的各种选项和设置,包括但不限于以下内容: 1. **实例配置**:你可以指定安装的 SQL Server 实例名称,通常可以是默认实例(不带实例名)或者命名实例...
总结来说,当遇到`phpinfo()` 中 `Loaded Configuration File` 为 `(none)` 时,应检查以下几点: 1. 确保`php.ini`文件存在并包含正确的配置。 2. 使用 `strace` 工具跟踪PHP的系统调用,找出其查找`php.ini`的...
Source Insight 3.5 Monokai style (sublime Text) color theme configuration file for C developer. need font: source code pro, but you can use consolas instead.
Configuration file not found(解决方案).md
Oracle Solaris 9 -Administrator’s Configuration File Reference Sun TM ONE Application Server-148
Xpadder Configuration File 2013.07.18
在删除残留的文件和库之后,我们可以重新下载和安装 MySQL。我们可以根据需要下载相应的版本,然后使用以下命令来安装 MySQL: `mysqld restart` Step 4: 查找临时密码 在安装 MySQL 之后,我们可以使用以下命令...
这里出现的问题是CMake在执行`find_package`命令时未能找到"MRPT"和"libuvc"这两个包的配置文件。本文将详细解释这个问题的原因以及相应的解决方法。 首先,我们看第一个问题,涉及到的是"MRPT"(Mobile Robot ...
并且,遵循良好的编程规范,如清晰的变量命名、适当的注释以及避免过于复杂的控制逻辑,可以帮助提高代码的可读性和维护性。 总之,"hsp-for-tia-portal-v15.1---configuration-file_canopen_" 提供了一个关于使用...
debian squeeze 中gedit speeddial 的配置
Solr作为许多搜索引擎的构架,在许多大网站上使用,但是如何configuration文件使其能够满足solr的要求呢?请看该文件