[.net]C#:使用 ConfigurationSettings 来读取配置信息

 

下面分几种情况来看.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.cs
using 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 directory
AppDomainSetup info = new AppDomainSetup();
info.ApplicationBase = "file:///" + System.Environment.CurrentDirectory;
// Create an application domain with null evidence
AppDomain dom = AppDomain.CreateDomain("RemoteDomain", null, info);
// Tell the AppDomain to execute the assembly
dom.ExecuteAssembly("HelloWorld1.exe");
// Clean up by unloading the application domain
AppDomain.Unload(dom);
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值