例一:dotnet程序的动态加载一:Assembly.Load 说了运行时无法更新dll,那是不是有其他办法能做到呢?答案自然是应用程序域。


Assembly只有Load,没有UnLoad,库并加载到当前程序域后没法卸载,但程序域可以卸载。当然主程序的程序域卸载的程序也就不存在了,为此我们要在当前程序域中创建创建新的程序域

System.AppDomain appDomain = System.AppDomain.CreateDomain("ApplicationDomainTest");

 

那是不是有了这个程序域后就能象例一去加载HelloLibrary.dll呢?

Assembly assembly = Assembly.Load(assemblyName);
object obj = assembly.CreateInstance(className);

不行!这样加载的话,程序集是在新的程序域还是当前程序域,我搞不清。感觉是当前程序域也加载了。因为就算Upload(appDomai),assembly还能用!这也相当于造成当前程序域加载HelloLibrary.dll。这样说对吗?且这样说吧,大家还可以做个试验,以上代码创建对象后,就算

AppDomain.Unload(appDomain);

 

HelloLibrary.dll也无法更新。好了,那该怎么做呢?


需要用一个代理类(继承自System.MarshalByRefObject),且该代理类不能与被加载的类放同一个类库,为此,我创建一个名为RemoteDo的类,并把他放在DomainBase类库。

public class RemoteDo : System.MarshalByRefObject
{
    
private IDo myDo;
    
/// <summary>
    
/// 加载对象
    
/// </summary>
    
/// <param name="pAssemblyName"></param>
    
/// <param name="pClassName"></param>
    public void LoadAssembly(string pAssemblyName,string pClassName)
    {
        myDo 
= buildDoActor(pAssemblyName, pClassName);
    }
    
private DomainBase.IDo buildDoActor(string pAssemblyName, string pClassName)
    {
        Assembly assembly 
= Assembly.Load(pAssemblyName);
        
object obj = assembly.CreateInstance(pClassName);
        
if (obj == null)            
            
return null;           
        
return obj as DomainBase.IDo;            
    }
    
/// <summary>
    
/// 执行对象的SayHello
    
/// </summary>
    
/// <returns></returns>
    public string SayHello()
    {
        
if (myDo == null)
            
return "指定的类未实现IDO";
        
else
            
return myDo.SayHello();
    }
}

相关文章:

  • 2021-05-25
  • 2021-09-02
  • 2021-09-02
  • 2022-02-08
猜你喜欢
  • 2021-05-26
  • 2022-12-23
  • 2021-11-02
  • 2022-02-17
  • 2022-12-23
  • 2021-09-09
  • 2021-12-15
相关资源
相似解决方案