C#手动加载类库和释放类库的代码
来源:互联网 发布:淘宝王子什么联系的 编辑:程序博客网 时间:2024/06/05 22:42
http://bbs.csdn.net/topics/20142932
建立一个独立的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
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
- C#手动加载类库和释放类库的代码
- module_init的加载和释放
- module_init的加载和释放
- module_init的加载和释放
- module_init的加载和释放
- module_init的加载和释放
- module_init的加载和释放
- c#释放已经加载的图片
- C#如何释放已经加载的图片
- C#如何释放已经加载的图片
- 释放-加载-删除驱动的代码
- 手动加载类的两种方法
- C# Bitmap类释放资源的方法
- 手动查看和删除IPC未释放的资源
- OC手动内存管理-方法的保留和释放
- 笔记备忘: 在 C# 中进行 win32 dll 的动态加载, 调用, 和释放
- 关于thinkphp5.0 rc4.0扩展类库自动与手动加载的问题
- 关于thinkphp5.0 rc4.0扩展类库自动与手动加载的问题
- HDU 4767 Bell (中国剩余定理)
- 重要的伪文件系统/proc
- 点击Android系统back键
- HDU 4768 Flyer 二分
- 2014雅虎笔试题之矩阵中查找字符串
- C#手动加载类库和释放类库的代码
- 2014百度笔试现场突发奇想(就收购搜狗来说)
- hdu 4768 Flyer 思路+二分
- Sharepoint2010-CustomAction之CopyListItem
- The connection to adb is down, and a severe error has occured.
- servlet2.5过滤器简单讲解
- 黑马程序员C#接口
- ios下拉刷新笔记
- dwr 后台服务器推送技术