none
关于<codeBase>元素的用法 RRS feed

  • 问题

  • 在项目中添加了App.config,内容如下:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <runtime>
     <assemblyBinding xmlns ="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
      <assemblyIdentity name =" CarLibrary" publicKeyToken="30d9105f2243067d" />
      <codeBase version="2.0.0.0" href="file:///C:/MyTest/CarLibrary.dll" />
      </dependentAssembly>
     </assemblyBinding>
     </runtime>
    </configuration>
    
    想让runtime定位项目所需的assembly,却出现这样这样的exception,内容如下:
    未处理 System.IO.FileNotFoundException
     Message="未能加载文件或程序集“CarLibrary, Version=2.0.0.0, Culture=neutral, PublicKeyToken=30d9105f2243067d”或它的某一个依赖项。系统找不到指定的文件。"
    我想请对这方面比较了解的朋友给点指点,谢谢。
    2010年6月6日 11:29

全部回复

  • 你好!

         到你指定的路径下检查这个程序集是否存在,名称,版本,文化,公钥标记都要一致才可以!

         另外,本机上的程序集通常通过<probing>元素中的privatePath来指定!


    周雪峰
    2010年6月7日 0:12
    版主
  • 你好!谢谢周雪峰的答复。

    我很仔细地找过了,文件是存在的。

    下面是一些实验细节:

    我实验的目标是:用exe Configuration file 中的<codeBase>元素来定位应用程序所需的外部程序集。所以没有使用只能用于相对路径的<privatePath>元素。关于<privatePath>的实验我做过了,实验成功。下面是我的实验步骤,希望能够让各位大哥师姐指点出错误:

    1.创建工程CodeBaseClient项目,并引用事先编译好的CarLibrary.dll,并且这个assembly已经被部署到GAC中。在executable application用到了assembly中的类。此时,编译一切正常,程序OK!

    2.我接下来想用一用<codeBase>的威力。于是,在项目中添加了一个App.config文件,内容如问题里所显示(“文化”默认是中性,版本是2.0.0.0,名称是CarLibrary,公钥标记是成GAC那边拷贝的,错不了。)。就这样,下载了GAC中的相关程序集,添加了程序配置文件,点击“保存全部”,然后再次编译,呵呵,很搞笑的,第一次程序可以运行成功,但第二次,第三次。。。都不行。这个步骤做了N遍,都这样,不知原因!Exception的基本信息如问题中的内容。

    以上就是实验的一些步骤和细节,至今这个问题也没得到解决。希望论坛里的哪位“神医”给做做诊断,以解吾一心病矣!在此,先提前谢谢大家了!

    2010年6月7日 5:22
  • 你好!

        重新生成的话,版本号会增加,你检查一下看看!


    周雪峰
    2010年6月7日 14:00
    版主
  • 你好!

    我直接从编译好的程序集拷贝到file:///C:/MyTest/里的,所以应该不存在这个问题。

    2010年6月8日 4:29
  • 你好!

         你在程序里是如何引用这个程序集的呢?


    周雪峰
    2010年6月8日 9:51
    版主
  • 你好!

    首先,我创建了一个强名称的CarLibrary.dll,并把它部署到GAC中,此时,运行程序肯定是正常的。

    然后,我拷贝了一份CarLirary.dll到到工程目录外部的一个文件夹中!并用<codeBase>定位外部程序集所在路径。

    接着,卸载GAC中的CarLibrary。

    最后,再调试程序,第一次是按预期执行的。第二次,第三次...就会出现FileNotFoundException。

     

    2010年6月8日 15:28
  • 你好!

         在你的程序中是如何引用这个程序集的?Load载入,还是在项目里添加的引用?


    周雪峰
    2010年6月8日 15:46
    版主
  • 你好!

    我用的是项目里添加的引用。Load载入还没用过。

    2010年6月8日 16:16
  • 你好!

         请问你的引用时指向哪个目录的?如果是那个dll的项目路径就会发生这个问题!


    周雪峰
    2010年6月9日 10:19
    版主
  • 你好,谢谢这么耐心的指导!

    引用时我指向的是CarLibrary.dll的原来的的项目路径,而不是file:///C:/MyTest。你的意思是:要指向file:///C:/MyTest中的CarLibrary.dll吗?

    (1)这种情况我试过了,还是不行。我想请教一下,因为项目工程对于Private Assembly的引用,在程序编译的时候会将该assembly拷贝到与客户端程序相同的目录。如果是GAC assembly当然不用拷贝了。那么,我想问的是,<codeBase>的作用是让runtime定位客户端程序的外部程序集,包括本地和远程的外部地址中相应的程序集,那么,我想,<codeBase>这个元素应该是用于客户端程序所在目录内没有所需的assembly,而让runtime在客户端程序运行的时候,能够到外部去访问所需要的assembly,或者,在程序运行的时候能够把相应的文件拷贝到程序所在的目录中,是这样的吗?

     

    (2)这里还有一点情况要说明,有人说会不会是外部的文件夹没有读写操作权限。假如是这样的话,我应该如何设置?在我的电脑上,MyTest文件夹的属性是:“只读”属性是个小方框,“隐藏”属性没打钩,为空。CarLibrary.dll文件中“只读”和“隐藏”都为空。不知道这样的设置是否有足够的文件访问权限。我的OS是XP Pro SP3的。

    2010年6月9日 17:31
  • 你好!

         我按你提问的顺序谈谈我对这个问题的理解:

         1,你的理解是正确的,如果指定CodeBase元素,会下载到本机的一个缓存中!

         2,这个问题并非权限引起的,我认为是版本号引起的,你每次重新生成,那个dll的版本号都是递增的,而你的CodeBase指定的版本号不变,所以无法加载程序集!


    周雪峰
    2010年6月10日 10:46
    版主
  • 你好!

           那我应该怎么做呢?

    2010年6月10日 15:09
  • 你好!

         很简单,你重新生成dll以前,修改配置文件中的codebase元素!这个本来就是部署以后使用的,不可能部署了以后还一遍有一遍的重新生成!


    周雪峰
    2010年6月10日 15:48
    版主
  • 你好!

          你的意思是,生成CarLibrary.dll以后再去用<codeBase>引用吗?我用AssemblyInfo.cs中的属性把CarLibrary.dll的版本号配为2.0。生成以后,我就没有重复去生成那个dll。这是怎么回事?

    2010年6月10日 16:08
  • 你好!

        你F5启动的时候,整个解决方案中的项目都被重新生成了!


    周雪峰
    2010年6月11日 12:05
    版主
  • 你好!

           我的CarLibrary.cs没有包括在CodeBaseClient项目中,CarLibrary.dll是已经编译好的!

    2010年6月11日 16:06
  • 你好!

        你直接在CarLibrary.dll这个文件上右键-〉属性-〉看看版本号!


    周雪峰
    2010年6月12日 13:01
    版主
  • 你好!

           检查过了,assembly version = 2.0.0.0。No problem,I'm confused !

    2010年6月12日 15:44
  • 周雪峰你好!

         不知道能不能把项目文件发给你,你运行一下看在你的电脑上会不会出现问题?

    2010年6月12日 15:46
  • 你好!

         我的邮箱是:xuefeng1982@live.cn,你把项目发给我!我帮你看看!


    周雪峰
    2010年6月13日 12:32
    版主
  • 你好!

           我已经发过去了,谢谢!

    2010年6月15日 19:53
  • 你好!

        你的dll的版本号是1.0.0.0,你修改成这个就可以了,我已经测试成功了!


    周雪峰
    2010年6月19日 1:18
    版主
  • 你好!

           1.0.0.0好像是文件的版本号,我知道程序集的版本号是2.0.0.0对吧。那我改了试试啊,谢谢咯:-)

    2010年6月20日 6:01
  • 你好!

          不知道怎么的,我改了还是不行。你是不是把dll部署到GAC中了呀?

    2010年6月20日 6:43
  • 你好!

        在我机器上是测试通过的,我把dll剪切到C:\MyTest文件夹下,然后

        codeBase version = " 1.0.0.0 "就测试成功了!


    周雪峰
    2010年6月20日 10:28
    版主
  • 你好!

          这样啊,我的貌似没成功啊,我再捣鼓捣鼓~~~

    2010年6月20日 13:59