C#手动加载类库和释放类库的代码

来源:互联网 发布:淘宝王子什么联系的 编辑:程序博客网 时间:2024/06/05 22:42
http://bbs.csdn.net/topics/20142932
using System;using System.IO;using System.Reflection;using System.Reflection.Emit;class Test {   public static void Main() {      AppDomain currentDomain = AppDomain.CurrentDomain;            InstantiateMyType(currentDomain);   // Failed!      currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolver);            InstantiateMyType(currentDomain);   // OK!   }      static void InstantiateMyType(AppDomain domain) {      try {         domain.CreateInstance("MyAssembly", "MyType");      } catch (Exception e) {         Console.WriteLine(e.Message);      }   }      // Loads the content of a file to a byte array.    static byte[] loadFile(string filename) {      FileStream fs = new FileStream(filename, FileMode.Open);      byte[] buffer = new byte[(int) fs.Length];      fs.Read(buffer, 0, buffer.Length);      fs.Close();         return buffer;   }      static Assembly MyResolver(object sender, ResolveEventArgs args) {      AppDomain domain = (AppDomain) sender;      // Once the files are generated, this call is      // actually no longer necessary.      EmitAssembly(domain);            byte[] rawAssembly = loadFile("temp.dll");      byte[] rawSymbolStore = loadFile("temp.pdb");      Assembly assembly = domain.Load(rawAssembly, rawSymbolStore);      return assembly;   }      // Creates a dynamic assembly with symbol information   // and saves them to temp.dll and temp.pdb   static void EmitAssembly(AppDomain domain) {      AssemblyName assemblyName = new AssemblyName();      assemblyName.Name = "MyAssembly";      AssemblyBuilder assemblyBuilder = domain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Save);      ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule", "temp.dll", true);      TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public);      ConstructorBuilder constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, null);      ILGenerator ilGenerator = constructorBuilder.GetILGenerator();      ilGenerator.EmitWriteLine("MyType instantiated!");      ilGenerator.Emit(OpCodes.Ret);      typeBuilder.CreateType();            assemblyBuilder.Save("temp.dll");   }}

建立一个独立的AppDomain,在新的Domain里面加载Assembly然后运行,最后通过卸载AppDomain来卸载Assembly。
具体操作的时候还有一些需要注意的东西,可以参考Eric Gunnerson的Working With C#专栏:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp09192002.asp
原创粉丝点击