none
项目的文件移动导致的找不到程序集问题。 RRS feed

  • 问题

  • 就是我原来项目有IService层和Service层 命名空间是TedOrderSystem.IService,TedOrderSystem.Service
    我现在觉得太麻烦,就想把他合并。
    然后就都丢到了一个工程就建了一个TedOrderSystem 只移动了文件项目里面的命名空间没有改
    然后重新编译,编译通过。
    然后一运行就出现找不到程序集TedOrderSystem.ISerivce.xxxxx 这种情况
    我UI 以及要调用TedOrderSystem 引用都删除了再重新引用的 但是还是出现这个问题。。
    希望知道的告诉下!谢谢了

    2009年7月16日 6:56

答案

  • 您好,不用Assembly.Load也可以用Type.GetType来加载另一个程序集的类型最终将都用到Activator.CreateInstance来实例化。
    我在网上下载了unity的源码,简单看了一下,应该采用了Type.GetType。
    虽然没有深入了解unity框架,但原理跑不掉,这是控制反转(IoC),也有称依赖注入(DI)的原理。
    目的就是让接口与实现相分离,所以不必把接口所在的程序集与具体实现的程序集放在一块。
    应不了解您的具体操作,故两个建议:
    1、客户程序不需要依赖于具体实现,所以您只需把具体实现(在您提供的信息来看应该是Service所在的程序集)直接copy到客户程序的bin文件夹下即可,不用引用。
    2、检查相应的配置文件,例如在整合之前配置的Service所在的程序集名称应改为之后修改的,如果不是通过配置文件则回想一下是否在代码中有指名先前Service所在的程序集。
    因为Type.GetType如果加载不了正确的程序集即会失败。
    • 已标记为答案 senarukana 2009年7月16日 16:17
    2009年7月16日 15:38

全部回复

  • 在运行时出错,说明使用了反射来动态实例化。目的是为了解耦,个人并不建议您把两者合并。
    用反射加载程序集时会用到Assembly.Load等动态加载方法(具体可参考MSDN中反射的介绍);
    实例化时会用到 Activator.CreateInstance,请查看您代码中是否正确指定了程序集的位置
    2009年7月16日 7:22
  • 你好!
         你把TedOrderSystem.ISerivce.xxxxx程序集复制到你的项目里试试!
    周雪峰
    2009年7月16日 8:34
    版主
  • 我是采用了unity框架,程序集肯定没有指定错,要不编译都成功不了。。。
     
     TedOrderSystem.ISerivce.xxxxx 程序集复制到你的项目里试试!是什么意思?我不懂ioi
    2009年7月16日 8:47
  • 按照命名空间的名字ISerivce,推测代码是用接口来编程的,具体实现的程序集即使没有指定,编译时也不会出错。
    主要是代码中加载TedOrderSystem.Service所在的程序集是否正确,建议您在代码中搜索Assembly.Load等字样,看看加载的位置。
    2009年7月16日 9:14
  • Assembly.Load 我不是采用这种方式
    我是直接采用unity这种 container.RegisterType<iservice,service>这样。。
    我不把这Iservice,Service这两个项目集拖到一起很正常,但是一拖到一起去,重新引用下,再编译成功了。然后运行就报错

    2009年7月16日 10:49
  • 您好,不用Assembly.Load也可以用Type.GetType来加载另一个程序集的类型最终将都用到Activator.CreateInstance来实例化。
    我在网上下载了unity的源码,简单看了一下,应该采用了Type.GetType。
    虽然没有深入了解unity框架,但原理跑不掉,这是控制反转(IoC),也有称依赖注入(DI)的原理。
    目的就是让接口与实现相分离,所以不必把接口所在的程序集与具体实现的程序集放在一块。
    应不了解您的具体操作,故两个建议:
    1、客户程序不需要依赖于具体实现,所以您只需把具体实现(在您提供的信息来看应该是Service所在的程序集)直接copy到客户程序的bin文件夹下即可,不用引用。
    2、检查相应的配置文件,例如在整合之前配置的Service所在的程序集名称应改为之后修改的,如果不是通过配置文件则回想一下是否在代码中有指名先前Service所在的程序集。
    因为Type.GetType如果加载不了正确的程序集即会失败。
    • 已标记为答案 senarukana 2009年7月16日 16:17
    2009年7月16日 15:38
  • 谢谢!
    我就是都脱进去,Iservice,Service这原来两个项目都没动,命名空间也是没动,还是
    TedOrderSystem.IService和TedOrderSystem.Service这两个命名空间,只是都拖到了TedOrderSystem的这个类库下面。
    其实我是觉得层太多太麻烦了,有10层,分的太细了。反而麻烦。。
    所以我干脆建了一个TedOrderSystem 把以前的Infrastructure,Utility,ISerice,Service,Validate都扔到一起就通过folder这样也好,
    我看了一些开源项目比如Oxite也是采取这种。。
    2009年7月16日 16:26