xenogear

当知道了某样知识之后,就会发现其实什么都不知道

如何在运行时加载不处于应用程序目录下的assembly

通常来说一个程序添加了引用之后,最后执行时简单将所有引用到的assembly放在同一个目录下就可以了。不过,也可能需要这样的情况,就是使用到不是同一个目录下的assembly。
这个问题在KB 837908中有描述,讲了如下三种方法:
第一个方法:将assembly放到GAC中
第二个方法:就是在.config文件中加入<codeBase>标签
如:
<configuration>
   
<runtime>
      
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         
<dependentAssembly>
            
<assemblyIdentity name="MyAssembly2"  culture="neutral" publicKeyToken="307041694a995978"/>
            
<codeBase version="1.0.1524.23149" href="FILE://C:/Myassemblies/MyAssembly2.dll"/>
         
</dependentAssembly>
      
</assemblyBinding>
   
</runtime>
</configuration>
第三个方法:使用AssemblyResolve事件
这个方法利用了AppDomain的AssemblyResolve事件,在程序开始注册这个事件,然后就可以在这个事件中处理了。比如:
private System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    System.Reflection.Assembly myAssembly, objExcutingAssemblies;
    
string strTempAssmbPath = "";
    objExcutingAssemblies 
= System.Reflection.Assembly.GetExecutingAssembly();
    System.Reflection.AssemblyName[] arrName 
= objExcutingAssemblies.GetReferencedAssemblies();

    
foreach(System.Reflection.AssemblyName strName in arrName)
    
{
        
if(strName.FullName.Substring(0, strName.FullName.IndexOf(",")) == args.Name.Substring(0, args.Name.IndexOf(",")))
        
{
            strTempAssmbPath 
= "c:\" + args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
            
break;
        }

    }

    myAssembly 
= System.Reflection.Assembly.LoadFrom(strTempAssmbPath);
    
return myAssembly;
}


除了这三种方法外,还有如下的方法
第一个方法就是使用反射,自己动态Load assembly。这种方法不是很好,因为这样不能添加这个assembly的引用,所以要在程序中反射得出方法、属性等。
第二:如果要用到的assembly是处于需要引用程序执行文件的下级子目录中,就可以有下面两种方式:
a、使用probing元素,如
<configuration>
   
<runtime>
      
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         
<probing privatePath="bin;bin2\subbin;bin3"/>
      
</assemblyBinding>
   
</runtime>
</configuration>
b、利用AppDomain的AppendPrivatePath
比如:AppDomain.CurrentDomain.AppendPrivatePath("common");

posted on 2004-09-16 15:36  什么都不知道  阅读(1854)  评论(2编辑  收藏  举报

导航