[.net]C#:使用 ConfigurationSettings 来读取配置信息 |
flyby 发表于 2005/8/24 14:22:28 | 下面分几种情况来看.net中,默认那个配置文件起作用。
情况1:
如果是一个标准的Win独立应用,或者一个标准的WEB独立应用,就不用说了,大家都知道。配置文件定义配置信息用下面代码,简单读取配置信息。using System.Configuration;string ww = ConfigurationSettings.AppSettings["SQLConnString"];// 或者其他 ConfigurationSettings 类的方法获得配置信息
情况2:
如果是一个需要被Win程序调用的DLL组件,配置信息放在调用它的Win程序的配置文件(app.config)中,调用代码仍然是情况1简单的那两行调用代码。
情况3:
如果是一个需要被WEB程序调用的DLL组件,配置信息放在调用它的WEB程序的配置文件(web.config)中,调用代码仍然是情况1简单的那两行调用代码。
情况4:
如果你编写的是一个独立的Win的服务,跟情况1完全一样,把配置信息文件放到Win服务项目中。Win服务中再用情况1上面的代码直接调用即可。
情况5:
如果是一个组件,被Win服务所调用,跟情况2、3完全一样,把配置信息文件放到Win服务项目中。组件中,再用情况1上面的代码直接调用即可。
情况6:
如果你编写的是一个独立的Com+企业应用。并且这个Com+应用激活模式是“库应用程序”,组件将在创建者进程中被激活。跟情况 2、3、5 类似,这时候的Com+就可以认为是一个组件。把配置信息文件放到调用这个Com+的项目中。这个COM+中,用情况1上面的代码直接调用即可。
分析以上几种情况:起作用的配置文件其实是当前应用程序域的配置文件,你可以在代码中通过AppDomain.CurrentDomain.SetupInformation.ConfigurationFile这个代码,获得当前起作用的配置文件。
情况7:
如果你编写的是一个独立的Com+企业应用。并且这个Com+应用激活模式是“服务器应用程序”,组件将在专用服务器进程中被激活。即这样的配置 [assembly: ApplicationActivation(ActivationOption.Server) ]这时候,麻烦来了,我们用 AppDomain.CurrentDomain.SetupInformation.ConfigurationFile 获得的是当前有效配置文件是C:\WINDOWS\system32\dllhost.exe.config这个文件默认并不存在,我们自己手工创建这个文件,并把配置信息写到这个文件中。Debug 程序,我们仍看会看到“未将对象引用设置到对象的实例。”这样的异常产生。以上我们得出的结论并不适用这个情况。
继续分析原因:
微软的Com+并不是一个彻头彻尾的.net应用,里面有大量的非托管代码。问题就产生在这里,非托管代码中,并没有应用程序域与应用程序域的配置文件的概念。于是乎,第七种情况就产生了。第七种情况目前能考虑到的解决方法,就是把配置文件的路径作为一个参数传递进Com+。
另外,如果你的程序是完全意义上的.net程序(也就是不是上述第7中情况)你是可以修改一个应用程序的默认配置文件的。具体请看参MSDN中关于AppDomainSetup.ConfigurationFile 属性 和 IAppDomainSetup.ConfigurationFile 属性 的描述和演示代码。
配置文件描述应用程序域的搜索规则和配置数据。创建应用程序域的宿主负责提供此数据,因为有意义的值因情况不同而异。例如,ASP.NET 应用程序的配置数据针对每个应用程序、站点和计算机进行存储,而可执行文件的配置数据针对每个应用程序、用户和计算机进行存储。只有宿主知道针对特定情况的配置数据的细节。当 AppDomain 完成它的第一次绑定后,此属性不得更改。参见:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemappdomainsetupclassconfigurationfiletopic.asp
手工配置应用程序配置文件的范例可以参看下面一篇文章中提到的代码:Executing ASMX files without a web server http://radio.weblogs.com/0105476/stories/2002/10/24/executingAsmxFilesWithoutAWebServer.html
或者看下面的代码,出处:http://www.gotdotnet.com/team/clr/AppdomainFAQ.aspx// C# Sample Code// File: HelloWorld1.csusing System;using System.Threading;
public class HelloWorld{public void SayHello(String greeting){Console.WriteLine("In the application domain: " + Thread.GetDomain().FriendlyName);Console.WriteLine(greeting);}
public static void Main( String[] argv ){HelloWorld o = new HelloWorld();o.SayHello("Hello World!");}}
// C# Sample Code// File: ExecAssembly.cs// Creates a remote application domain and executes an assembly// within that application domain.
using System;using System.Reflection;using System.Runtime.Remoting;public class ExecAssembly{public static void Main( String[] argv ){// Set ApplicationBase to the current directoryAppDomainSetup info = new AppDomainSetup();info.ApplicationBase = "file:///" + System.Environment.CurrentDirectory;// Create an application domain with null evidenceAppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info);// Tell the AppDomain to execute the assemblydom.ExecuteAssembly("HelloWorld1.exe");// Clean up by unloading the application domainAppDomain.Unload(dom); }}
|
阅读全文(8342) | 回复(0) | 编辑 | 精华 |
|
|
| « | December 2025 | » | | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | | |
|
| 公告 |
此Blog中的文章仅代表本人当时观点,不对其正确性做任何担保。转载原创,请知会作者。QQ MSN | |
| Blog信息 |
|
blog名称:倾程记 日志总数:27 评论数量:72 留言数量:-3 访问次数:234694 建立时间:2005年7月8日
| |

|