反射在windows服务中无效?

试着把Blog的数据缓存写成Windows Service,
web去调用该service中的数据
结果,出现的问题却是我始料未及的。

Blog是按标准的多层架构来编码的

Factory中反射出IDocument接口,代码如下:

public static LemongTree.Blog.IDAL.IDocument CreateIDocument()
        {
            string ClassName = path + ".DocumentSQLDAL";
       
            try
            {
                WebLog.WriteLog("Debug:" + ClassName);
                IDocument doc = (IDocument)Assembly.Load(path).CreateInstance(ClassName);
                WebLog.WriteLog("IDocument创建成功:");
                return doc;
            }
            catch (Exception ex)
            {
                WebLog.WriteLog("DataAccess Error:" + ex.ToString());
                return null;
            }
        }
这段代码直接在iis中运行一点问题都没有,但做成windows服务后,捕获的异常为:

2007-8-7 22:17:32:Debug:LemongTree.Blog.DAL.SQLServer.DocumentSQLDAL  //factory层红色部分
===================================================
2007-8-7 22:17:32:DataAccess Error:System.Reflection.TargetInvocationException: 调用的目标发生了异常。 ---> System.NullReferenceException: 未将对象引用设置到对象的实例。
   在 BlogConfig..ctor()
   在 BlogConfig.get_Instance()
   在 LemongTree.Blog.DAL.SQLServer.DocumentSQLDAL..ctor()
   --- 内部异常堆栈跟踪的结尾 ---
   在 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
   在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
   在 System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
   在 System.Activator.CreateInstance(Type type, Boolean nonPublic)
   在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   在 System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
   在 System.Reflection.Assembly.CreateInstance(String typeName)
   在 LemongTree.Blog.Factory.DataAccess.CreateIDocument()

由上面的异常可以看出,运行到IDocument doc = (IDocument)Assembly.Load(path).CreateInstance(ClassName);时捕获到异常,
也就是说在反射时失败了,难道不能在windows服务器运用?

是我的疏忽,代码是正确的,也可以反射,仔细分析了一下,发现是我配置文件的问题 ^_^

11 Responses

  1. liuqiang August 8 2007 , 08:42
    liuqiang
    多层架构的东东,俺一直看不懂.
    看了两天Petshop也还是不清楚
    #1
  2. 幻想曲 August 8 2007 , 08:48
    幻想曲
    我这个相对来说结构还是比较简单的
    #2
  3. takwai August 9 2007 , 18:24
    takwai
    这种就是工厂模式?

    BLL 的层是不是负责接收 表单的?处理?

    实在搞不懂= =!

    因为自己搞了一个,感觉好复杂,一个方法,BLL有,DAL有,接口那里还要弄个, 真晕...
    #3
  4. llinzzi August 11 2007 , 08:40
    llinzzi
    bll是业务处理的
    表单的接受可以放在表现层,bll是具体实现发送短信拉,登录啥的,算数据层和表现层的粘合剂。
    不过我发现bll用好很有难度的,很难减低偶尔,大多数时候会增加代码量,现在基本都把数据层的东西写在了存储过程里了,能放的都放进去了,数据层dal就成了我的bll了,感觉更清晰,有待提高,哈哈
    #4
  5. 妞妞 August 17 2007 , 22:20
    妞妞
    程序我也想要一份,能否发给一份给我啊~
    #5
  6. 幻想曲 August 17 2007 , 22:40
    幻想曲
    [quote=妞妞]
    程序我也想要一份,能否发给一份给我啊~

    什么程序?没说过要提供啊
    #6
  7. 妞妞 August 18 2007 , 12:11
    妞妞
    你的Blog程序,能否发给我一份~
    #7
  8. 幻想曲 August 18 2007 , 13:47
    幻想曲
    [quote=妞妞]
    你的Blog程序,能否发给我一份~

    sorry
    不提供该程序代码
    #8
  9. kerry October 19 2007 , 13:10
    kerry
    可能是path的问题,以服务的形式运行的话当前路径可能就不是程序所在的目录了。
    #9
  10. kerry October 19 2007 , 13:12
    kerry
    所以 Assembly.Load(path) 的时候没拿到,后面的CreateInstance就跑出null异常了,极有可能使这个原因。
    #10
  11. 幻想曲 October 19 2007 , 15:18
    幻想曲
    大鱼兄
    不是路径的问题,是配置文件差一项配置的数据访问类没有复制到服务所在的目录,
    所以初始化时失败
    #11

Write a comment:



(Will show your Gravatar icon)  



[b][/b] - [i][/i] - [u][/u]- [quote][/quote]

:-/ ^_^ :d :o :kiss: :) :p :se: [yeah] :( :love: :han: :up: :cry: :zzz: o_o

申请链接请看这里