例一: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);
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();
}
}
{
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();
}
}