<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_jiangnii</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/22795/rss</id><updated>2010-04-19T09:22:49Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/22795/rss"/><entry><id>http://www.cnblogs.com/jiangnii/archive/2010/04/19/1715532.html</id><title type="text">如何让ConfigurationManager打开任意的配置文件</title><summary type="text">我有时候会有这样的需求：工程A通过某种方式引用了工程B，A和B都有各自的一些配置，我不想把B的配置写到A的配置文件里，而是希望B也有自己的配置文件。运行时程序从A启动，那我怎么样才能让ConfigurationManager能正确访问到B的配置文件呢？</summary><published>2010-04-19T09:22:00Z</published><updated>2010-04-19T09:22:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2010/04/19/1715532.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2010/04/19/1715532.html"/><content type="html">&lt;p&gt;VisualStudio的配置文件很好很强大，用来保存数据库连接字符串或键值对都非常方便，只需要通过ConfigurationManager的ConnectionStrings或AppSettings属性就可以随时取用。但ConfigurationManager打开的是工程的默认配置文件，而我有时候会有这样的需求：工程A通过某种方式引用了工程B，A和B都有各自的一些配置，我不想把B的配置写到A的配置文件里，而是希望B也有自己的配置文件。运行时程序从A启动，那我怎么样才能让ConfigurationManager能正确访问到B的配置文件呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;翻翻ConfigurationManager的签名，有一个方法吸引了我的注意：OpenExeConfiguration(string exePath)。看上去我可以把B工程的配置文件路径作为参数传递到这个方法，执行后会返回一个Configuration对象，之后我就可以顺利的访问其中的配置信息了&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可惜现实是残酷的，OpenExeConfiguration实在是一个古怪的方法，我发现成功调用需要满足几个雷人的条件：&lt;/p&gt;&#xD;
&lt;p&gt;1、参数exePath必须是 *.exe&amp;nbsp;或 *.config 的格式（可能还有其他格式，但 *.dll 肯定不行）&lt;/p&gt;&#xD;
&lt;p&gt;2、exePath对应的文件必须存在（例如 exePath = "C:/ProjectB.exe"，那C盘下必须要有一个名为ProjectB.exe的文件），但实际上这个文件一点用也没有&lt;/p&gt;&#xD;
&lt;p&gt;3、方法调用后最终打开的配置文件实际上名为 exePath + ".config" （所以 exePath = "C:/ProjectB.exe" 时配置文件就是&amp;nbsp;C:/ProjectB.exe.config，而 *.config 的配置文件就得叫 *.config.config）&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;可能是微软工程师另有打算，也可能这个方法不是我想象中这样用的，总之上述几个条件真的让我望而却步了。要是每次总得在目录下添加一个空白文本，把名字取好后缀改为.exe，再把实际的配置文件的后缀改为.exe.config。。。这个OpenExeConfiguration恐怕不会让我更方便，只会让我更纠结。。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;ConfigurationManager还有几个类似的方法，但我不知道怎么用，于是遍寻Google和MSDN。终于发现了真正能解决我问题的方法：OpenMappedExeConfiguration&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不多说，直接上代码了：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;!--&lt;br/ /&gt;&lt;br/ /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br/ /&gt;http://www.CodeHighlighter.com/&lt;br/ /&gt;&lt;br/ /&gt;--&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;configPath&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;...;&lt;br /&gt;&lt;br /&gt;ExeConfigurationFileMap&amp;nbsp;map&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ExeConfigurationFileMap();&lt;br /&gt;map.ExeConfigFilename&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;configPath;&lt;br /&gt;&lt;br /&gt;config&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ConfigurationManager.OpenMappedExeConfiguration(map,&amp;nbsp;ConfigurationUserLevel.None);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;OK，搞定，收工&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jiangnii/aggbug/1715532.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jiangnii/archive/2010/04/19/1715532.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/08/06/845168.html</id><title type="text">C#基础学习 —— 异步编程篇 2</title><summary type="text">基于事件的异步模式，用 BackgroundWorker 实现</summary><published>2007-08-06T10:00:00Z</published><updated>2007-08-06T10:00:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/08/06/845168.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/08/06/845168.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/08/05/843872.html</id><title type="text">C#基础学习 —— 异步编程篇 1</title><summary type="text">使用 IAsyncResult 对象的异步设计模式学习</summary><published>2007-08-05T12:17:00Z</published><updated>2007-08-05T12:17:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/08/05/843872.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/08/05/843872.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/05/18/751431.html</id><title type="text">网络监控器源码</title><summary type="text">我用C#写的网络监控器，采用Net1.1框架。这里是程序源码：下载</summary><published>2007-05-18T05:54:00Z</published><updated>2007-05-18T05:54:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/05/18/751431.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/05/18/751431.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/05/15/747013.html</id><title type="text">（转）TCP/IP 数据包头格式</title><summary type="text">最近狂补基础，猛看TCP/IP协议。不过，书上的东西太抽象了，没有什么数据实例，看了不 久就忘了。于是，搬来一个sniffer，抓了数据包来看，呵呵，结合书里面得讲解，理解得 比较快。我就来灌点基础知识。　　　开始吧，先介绍IP协议。　 　　IP协议（Internet Protocol）是网络层协议，用在因特网上，TCP，UDP，ICMP，IGMP数据都是按照IP数据格式发送得。IP协议提供的是不...</summary><published>2007-05-15T04:51:00Z</published><updated>2007-05-15T04:51:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/05/15/747013.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/05/15/747013.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/02/14/650488.html</id><title type="text">第12章 文本处理 (1)</title><summary type="text">12.1 字符一个字符由一个System.Char结构实例表示，该类型提供了两个常数字段：MinValue（0x0000）和MaxValue（0xFFFF）Char的静态方法GetUnicodeCategory以一个Char实例作为参数，返回一个System.Globalization.UnicodeCategory枚举值，我们可以根据该枚举值判断传入的字符的类型Char类型还提供有其他几个静态方...</summary><published>2007-02-14T07:34:00Z</published><updated>2007-02-14T07:34:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/02/14/650488.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/02/14/650488.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/02/13/649609.html</id><title type="text">第11章 事件</title><summary type="text">11.1 发布事件classMailManager{//1、在MailManager内部定义MailMsgEventArgs类型publicclassMailMsgEventArgs:EventArgs{//传递给事件接受者的类型定义信息publicMainMsgEventArgs(Stringfrom,Stringto,Stringsubject,Stringbody){this.from=fr...</summary><published>2007-02-13T09:24:00Z</published><updated>2007-02-13T09:24:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649609.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649609.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/02/13/649432.html</id><title type="text">第10章 属性</title><summary type="text">10.1 无参属性无参属性(parameterless property)就是通常说的属性(property)。CLR支持静态属性、实例属性和虚属性。属性可以标记任何的访问限定修饰符，也可以被定义在接口中。属性不能被重载定义一个同时带get和set方法的属性时，编译器会在生成的托管模块中产生一个表示属性的get访问器方法和一个表示属性的set访问器方法，以及一个位于托管模块元数据中的属性定义，其中...</summary><published>2007-02-13T06:53:00Z</published><updated>2007-02-13T06:53:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649432.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649432.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/02/13/649280.html</id><title type="text">第9章 方法 (2)</title><summary type="text">9.5 引用参数CLR假设所有的方法参数都是按值传递，当参数为引用类型的对象时传递的是引用/指针的值，而值类型对象传递的是对象实例的一个拷贝C#中我们可以用out和ref关键字指定方法按引用的方式传递参数，从IL或CLR的角度来看out和ref关键字的行为实际上是一样的，二者的不同之处在于编译器会根据它们选择不同的机制来确保代码的正确性。开发时指定out和ref的好处是可以清晰的表示开发者的意图C...</summary><published>2007-02-13T03:57:00Z</published><updated>2007-02-13T03:57:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649280.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/02/13/649280.html"/></entry><entry><id>http://www.cnblogs.com/jiangnii/archive/2007/02/12/648574.html</id><title type="text">第9章 方法 (1)</title><summary type="text">9.1 实例构造器CLR要求每个引用类型至少定义一个实例构造器。在创建一个引用类型的实例时，系统首先为该实例分配内存，然后初始化对象的附加成员（即方法表指针和一个SyncBlockIndex），最后调用类型的实例构造器设置对象的初始化状态对于引用类型，默认情况下如果没有显式定义实例构造器，许多编译器包括C#都会自动定义一个公有的无参构造器少数几种情况下，类实例的创建不需要调用实例构造器，如调用Ob...</summary><published>2007-02-12T10:17:00Z</published><updated>2007-02-12T10:17:00Z</updated><author><name>jiangnii</name><uri>http://www.cnblogs.com/jiangnii/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jiangnii/archive/2007/02/12/648574.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jiangnii/archive/2007/02/12/648574.html"/></entry></feed>
