.NET: 如何通过AppDomain动态加载插件程序
来源:互联网 发布:em算法python实现 编辑:程序博客网 时间:2024/05/24 01:45
这是今天课堂上的一个小例子程序
1. 接口
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Interfaces{ public interface IPlugin { void Run(); }}.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
2. 插件
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace PluginLib{ [Serializable] public class Plugin:Interfaces.IPlugin { public void Run() { Console.WriteLine("插件在运行"); } }}.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
3. 主程序
AppDomain plugindomain = AppDomain.CreateDomain("PluginDomain");
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }#region 使用接口的方式来动态执行方法 Interfaces.IPlugin plugin = (Interfaces.IPlugin)plugindomain.CreateInstanceFromAndUnwrap("PluginLib.dll", "PluginLib.Plugin"); plugin.Run(); Console.WriteLine("在插件程序域中加载的程序集"); foreach (var item in plugindomain.GetAssemblies()) { Console.WriteLine(item.FullName); } #endregion
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }结果如下
注意:这种方式加载的插件,里面的类型必须声明可序列化([Serializable] ),否则就会出现下面的错误
但是,如果插件真的没有声明可序列化,是不是就没有办法呢?也不是这么说
4. 在主程序中添加一个TypeLoader
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Reflection;using System.IO;namespace _08_AppDomain_ServiceSample{ [Serializable] public class TypeLoader { public Assembly LoadAssembly(string path) { return Assembly.LoadFile(Path.Combine(Environment.CurrentDirectory, path)); } }}.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
5. 修改代码,利用TypeLoader作为中间人,去动态加载那些插件程序集
#region 使用加载代理的方式 TypeLoader loader = (TypeLoader)plugindomain.CreateInstanceFromAndUnwrap("08_AppDomain_ServiceSample.exe", typeof(TypeLoader).FullName); Interfaces.IPlugin plugin = (Interfaces.IPlugin)loader.LoadAssembly("PluginLib.dll").CreateInstance("PluginLib.Plugin"); plugin.Run(); Console.WriteLine("在插件程序域中加载的程序集"); foreach (var item in plugindomain.GetAssemblies()) { Console.WriteLine(item.FullName); } AppDomain.Unload(plugindomain); #endregion.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
- .NET: 如何通过AppDomain动态加载插件程序
- 如何通过AppDomain用特定的安全上下文加载外部程序集
- AppDomain 和动态加载
- 通过应用程序域AppDomain加载和卸载程序集
- 通过应用程序域AppDomain加载和卸载程序集
- 通过应用程序域AppDomain加载和卸载程序集
- 通过应用程序域AppDomain加载和卸载程序集[zz]
- 通过应用程序域AppDomain加载和卸载程序集
- 通过应用程序域AppDomain加载和卸载程序集
- 通过应用程序域AppDomain加载和卸载程序集
- C#中运用AppDomain动态加载程序集详解
- C#中运用AppDomain动态加载程序集详解
- C#中运用AppDomain动态加载程序集详解
- AppDomain和动态加载 转
- 动态加载与插件系统的初步实现(二):AppDomain卸载与代理
- .Net动态加载插件-反射
- AppDomain 动态加载及数据交互
- C#中动态加载卸载Appdomain
- IE 8 Accelerator加速器开发介绍{转载}
- Web.config中的特殊字符
- .NET :如何对数组进行排序
- .NET : 一定不要忘记关闭DataReader对象
- .NET : 如何利用GDI+绘制折线图
- .NET: 如何通过AppDomain动态加载插件程序
- 任务栏音量图标消失不见之解决方法汇总
- 。NET :遍历某个权限集中的权限列表
- .NET: 通过AppDomain级别控制安全策略的例子
- DataTable转换成JSON字符串的函数
- .NET : 如何在Windows Service中获取到当前工作目录
- Silverlight学习资源
- ASP.NET: 在Win 7中安装PetShop范例时要注意的问题
- .NET Mail : 注意Win 7 不再包含SMTP服务