bman's it blog

Do our coding

.Net应用程序配置文件中自定义节的应用域问题

配置文件段:
    <section name="Httpd.RouterDict"
             type="wwHttpd.RouterDictSection, wwHttpdTest.dll, Version=1.0.0.0, PublicKeyToken=Null"
             allowExeDefinition="MachineToApplication" />

出错代码段
                    routerDict = ((RouterDictSection)cfg.
                        GetSection(routerDictKey)).ChildElements;

(异常是不能把 RouterDictElementCollection转换为 RouterDictElementCollection,    ChildElements返回RouterDictElementCollection, routerDict是RouterDictElementCollection引用)

问题解决记录:

这册的问题可能是这个方面的问题引起的,我通过调试检测到了程序在运行时调用了2次相同名字的程序DLL文件, 可能是由于我用xunit进行测试的缘故,在读配置文件中的自定义节的时候程序加载了临时文件中的我测试的DLL的副本(不知道为什么为生成这个副本的,.NET自动生成的)所以造成了虽然2个类的名字和命名空间相同,但其实是两个DLL中同名的类,所以不能转换,目前要想办法解决这个加载路径和程序集部署问题

又想到了一点,就是由于我把TEST的DLL和XUNIT的UI程序方置在两个不同的目录中,因为读取配置文件中的节的时候如果遇到自定义节的时候会读取相应自定义类,由于UI是EXE,我测试的只是一个DLL,配置文件跟着EXE走,所以.NET加载规则先搜索EXE目录下面有没有相关DLL,没有就去其他PATH里找,所以就在读取配置文件的时候找到了副本DLL,而我类型转换的代码执行是在测试DLL中,所以就造成了这个类型的歧意

问题解决了,我查看了xunit的源代码,发现xunit在读取要测试的DLL的时候会先创建一个appdomain(应用域)这样在测试DLL中的所有TYPE都在这个域的assembly中了,而在读配置文件的时候是通过currentAppdomain(程序当前域)读取的,这样从配置文件生成的对象和DLL中的程序的类型转换属于不同的TYPE了,现在就是如果要测试这种情况的代码用XUNIT好象有些问题,不知道有没有其他的解决方法
 

posted on 2008-03-28 17:34 bman 阅读(286) 评论(0)  编辑 收藏 引用 所属分类: 笔记

只有注册用户登录后才能发表评论。

导航

<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

常用链接

留言簿(2)

随笔分类

随笔档案

最新随笔

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜