因为采用了插件结构,在.net中要动态加载和卸载必须通过应用程序域,因此对应用程序域进行了学习,下面是一个简单的例子,其实主要是把原来的接口转化为类,这个类要求继承System.MarshalByRefObject。接口为IHello:
public interface IHello { void SayHell(string str); }
远程接口为IRemoteHello:
public class RemoteHello:System.MarshalByRefObject,IHello { private IHello myDo; /// <summary> /// 加载对象 /// </summary> /// <param name="pAssemblyName"></param> /// <param name="pClassName"></param> public void LoadAssembly(string pAssemblyName, string pClassName) { myDo = buildDoActor(pAssemblyName, pClassName); } private IHello buildDoActor(string pAssemblyName, string pClassName) { Assembly assembly = Assembly.Load(pAssemblyName); object obj = assembly.CreateInstance(pClassName); if (obj == null) return null; return obj as IHello; } public void SayHell(string str) { myDo.SayHell(str); } }
具体实现类FirstHello:
public class FirstHello:IHello.IHello { public void SayHell(string str) { MessageBox.Show("qq"+str); } }
: /// <summary> /// 根据程序域加载 /// </summary> /// <param name="pluginFilePath"></param> /// <param name="ClassName"></param> /// <returns></returns> public static IHello.IHello GetAppDomain(AppDomain appDomain,string pluginFilePath, String ClassName) { //System.AppDomain appDomain = System.AppDomain.CreateDomain("ApplicationDomainTest"); IHello.RemoteHello myDo = appDomain.CreateInstanceFromAndUnwrap("IHello.dll", "IHello.RemoteHello") as IHello.RemoteHello; //在新建的程序域中加载类库,实际加载过程是在其他程序域。 myDo.LoadAssembly("HelloLibry", ClassName); return myDo; //得到Assembly中的所有类型 }
最后就是主程序调用了。源码如下:
程序集加载卸载