none
关于AppDomain.Load动态加载程序集 RRS feed

  • 问题

  • 请问,该方法是否可以加载存放在任意目录的程序集(非当前应用程序BaseDirectory的其他目录)。本人做过一些实验,因为实验结果不是很稳定,所以还不是十分确定。
    2009年8月17日 9:38

答案

  • 你好!
         1,CLR有自己的定位算法来探测相关的目录,来查找需要加载的程序集,这个属性是用来获取或设置应用程序基目录下的目录列表,这些目录被探测以寻找其中的私有程序集。各个目录用分号隔开。这个属性和<probing>中设置privatePath效果一样
         2,CLR的定位算法如下:
              1,如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。
              2,如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找
              3,如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:
         假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集
              C:\AppDir\AssemblyName.dll
              C:\AppDir\AssemblyName\AssemblyName.dll
              C:\AppDir\Path1\AssemblyName.dll
              C:\AppDir\Path1\AssemblyName\AssemblyName.dll
             
    周雪峰
    2009年8月18日 4:47
    版主

全部回复

  • 你好
    你可以通过
    AssemblyName assemblyRef = new AssemblyName();
        assemblyRef.CodeBase = "程序集的路径可以是其他目录的,但是得有读取权限等";

    然后通过AppDomain.Load加载
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月17日 10:01
    版主
  • 补充一句
    public Assembly Load(string assemblyString)
    {
        StackCrawlMark lookForMyCaller = StackCrawlMark.LookForMyCaller;
        return Assembly.InternalLoad(assemblyString, null, ref lookForMyCaller, false);
    }

    你可以看书实际上AppDomin的这些方法也是通过Assembly类的对应方法来实现的
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月17日 10:03
    版主
  • 你好,Load 方法并没有要求程序集在应该程序的目录下,我们目前有个项目是用的动态加载和卸载DLL并未出现不稳定的情况,你的问题是否是你其它代码所致?请仔细检查。
    知识改变命运,奋斗成就人生!
    2009年8月17日 11:25
    版主
  • 了解,如果是这样的话,我还有其他的几个疑问:

    第一:如果可以动态加载任意目录的中的程序集那么AppDomainSetup下的PrivateBinPath属性还有什么意义?
    第二:配置文件中的<runtime><assemblyBinding><probing privatePath="">配置项,指定程序集只能被包含在BaseDirectory下的子目录的限制还有什么意义?

    2009年8月18日 1:07
  • 你好!
         1,CLR有自己的定位算法来探测相关的目录,来查找需要加载的程序集,这个属性是用来获取或设置应用程序基目录下的目录列表,这些目录被探测以寻找其中的私有程序集。各个目录用分号隔开。这个属性和<probing>中设置privatePath效果一样
         2,CLR的定位算法如下:
              1,如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。
              2,如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找
              3,如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:
         假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集
              C:\AppDir\AssemblyName.dll
              C:\AppDir\AssemblyName\AssemblyName.dll
              C:\AppDir\Path1\AssemblyName.dll
              C:\AppDir\Path1\AssemblyName\AssemblyName.dll
             
    周雪峰
    2009年8月18日 4:47
    版主