2007年4月16日星期一

发现,.NET 2.0 程序配置文件

这次的毕业设计遇到一个很大的问题,或许会有跟我同让遭遇的人,
所以把这个写出来~

本来为了更好的抽象结构(其实是自己瞎吹的),偶把对WebServices的使用集中到一个类库里面,并且公开程序集,

我这里使用的是VB2005 自带 My 功能提供默认事例,在编程调试的时候都很好,可是已发布的时候,就出现问题了。
类库里面使用默认的编码进去值。本想通过DLL.config来配置这个东西,结果也不好使。
后来查了一下资料,才发现

在.NET中,配置文件除了机器文件意外,其他的都是exe.config,
也就是说DLL不能有自己的Config(我本来享用更多的My特性来的)

但并不是没有方法,单独的类库需要使用宿主的配置文件
比如,有个程序 A.exe 调用的B.dll,而B.dll 有使用了配置文件
这时使用B.dll.config文件进行配置是无效,只有通过A.exe.config才可以
可是直接添加进去配置值,也不可以,为什呢?

原来 默认的情况下,VS2005 只会产生当前项目的配置

<configsections>
<sectiongroup type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="applicationSettings">
<section type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="a.My.MySettings" requirepermission="false">
</sectiongroup>
<sectiongroup type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="userSettings">
<section type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="a.My.MySettings" requirepermission="false" allowexedefinition="MachineToLocalUser">
</sectiongroup>
</configsections>



默认情况下只会产生2个组 ApplicationSettings 和 UserSettings 代表2种不同的设置作用域
每个组里面都会添加一个节。之后还有对应设置的节

<applicationsettings>
<a.my.mysettings>
<setting name="UserInfoWidth" serializeas="String">
<value>173</value>
</setting>
</A.MY.MYSETTINGS>
</applicationsettings>
<usersettings>
<a.my.mysettings>
<setting name="ShowBGWork" serializeas="String">
<value>Checked</value>
</setting>
</A.MY.MYSETTINGS>
</usersettings>




看到这里就应该明白了,上边在组中声明一个a.My.MySettings,下边就是对应节
而且名字样式是 程序集名.My.MySettings (如果你要使用VB的话就这个是什么意思了)
这样要通过A.exe.config来配置B.dll 只要现在
分组里面在加上一句添加(根据需要,放在User还是Application中)
<blockquote>
<section type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" name="B.My.MySettings" requirepermission="false">
</blockquote>

之后再在下边对应的配置添加上配置信息,就大功告成了~


<B.my.mysettings>
<setting name="ServicesClassLibrary_RolesManageService_RolesManage" serializeas="String">
<value>http://localhost/Services/Secure/RolesManage.asmx</value>
</setting>
</B.MY.MYSETTINGS>



这样在程序启动后,就可以直接读取配置信息了,不过就是多了点要复制的东西(你可以从源文件力考过来)

没有评论: