问题原贴:
http://cloverprince.iteye.com/admin/blogs/481307
引用
4. 现有一个主程序用C#语言写成。现在要允许第三方开发人员编写扩展的类,约定第三方开发的类必须包含一个实现了某个已知接口(如interface IFooPlugin)的类,名称不限。如果要求第三方的类必须与主程序的二进制代码分开发布,把dll丢在某个文件夹内即可被动态装载使用,应如何实现?
回答:
每个插件作为一个程序集(Assembly),dll的形式。里面包含一个实现已知接口的类。使用Assembly.LoadFile()装载该插件,用Assembly.GetInterface()寻找程序集中实现了已知接口的类,用Activator.CreateInstance创建实例。
适用范围:
Mono2.0和Visual C# 2008中测试通过。反射机制自.NET 1.0开始就有。
实现:
先指定一个接口,比如叫Cloverprince.IPlugin。插件必须包含一个类,实现这个接口。
using System;
namespace Cloverprince
{
public interface IPlugin
{
String Name {get;set;} // 设定和获取名字
void Greet(); // 打招呼
}
}
创建一个插件。插件包含一个类,实现这个接口。
这个类叫HelloWorldPlugin.HelloWorld。
using System;
using Cloverprince;
namespace HelloworldPlugin
{
public class HelloWorld: Cloverprince.IPlugin
{
private String _Name;
public String Name {
get {
return _Name;
}
set {
_Name = value;
}
}
public void Greet() {
Console.WriteLine("Hello, {0}",Name);
}
}
}
这个类将被编译成一个dll程序集
另一个插件也类似的制作。
类名:GoodbyePlugin.GoodbyeWorld:
using System;
using Cloverprince;
namespace GoodbyePlugin
{
public class GoodbyeWorld: Cloverprince.IPlugin
{
public String Name { get;set; }
public void Greet() {
Console.WriteLine("Goodbye, {0}",Name);
}
}
}
编译成另一个dll。
现在,两个插件已经有了,只差一个主程序来读取这两个插件了。
主程序:
using System;
using System.IO;
using System.Reflection;
using Cloverprince;
namespace Main
{
class MainClass
{
private const String PLUGINS_PATH="plugins";
public static void Main(string[] args)
{
foreach(String fileName in Directory.GetFiles(PLUGINS_PATH,"*.dll"))
{
Assembly ass = Assembly.LoadFile(Path.GetFullPath(fileName));
foreach(Type t in ass.GetTypes()) {
if(t.GetInterface("Cloverprince.IPlugin") != null) {
IPlugin p = (IPlugin)Activator.CreateInstance(t);
p.Name="Cloverprince";
p.Greet();
}
}
}
}
}
}
以上,所有需要的文件齐备。
编译:
如上所述,每个插件编译成一个dll程序集,主程序随意。注意路径。
执行:
执行该程序需要的最小文件集(3个文件):
引用
.
|-- Main.exe
`-- plugins
|-- GoodbyeWorld.dll
`-- HelloworldPlugin.dll
执行:
Windows: Main 或者直接双击图标
Unix+Mono: mono Main.exe
引用
Goodbye, Cloverprince
Hello, Cloverprince
总结:
1. 主程序并不了解plugins目录中有多少插件。在运行时列举目录。
2. 主程序对每个plugins文件(比如叫HelloworldPlugin.dll)的了解只有:
- 这个程序集中有0个或多个类实现了IPlugin接口。
- 这个类拥有一个不带参数的构造方法。
分享到:
相关推荐
在电子设计大赛中,开发抽题小插件是一项常见的任务,用于随机选择参赛者需要解答的问题。本项目名为"C#抽题小插件",它采用C#编程语言实现,主要用于打开并处理PDF文件,这涉及到C#与PDF文档交互的技术。下面将详细...
通过解答《Thinking in Java》第四版的练习题,我们可以系统地巩固和提高Java编程技能,为成为一名出色的Java开发者打下坚实基础。这本书的习题涵盖了从基础到高级的各个方面,是每个Java学习者不可多得的实践资源。
《Thinking In Java》是Bruce ...通过《Thinking In Java》第四版的练习题解答,读者不仅可以巩固理论知识,还能通过实践提升编程技巧。这是一本值得深入研究的Java学习资料,每一个练习题都可能打开新的编程视角。
- 仓库为 2019 年第九届 MathorCup 高校数学建模挑战赛 A 题的解答代码 ## 题目 比赛分为 ABCD 四个题目,队伍按照要求选择 A 题解答, ## 解答 由于代码是两个同学分开写的,所以解题说明及代码运行说明分别放在...
2. **可扩展性**:设计为模块化、插件化,允许添加自定义功能和集成第三方服务,以满足不同场景的需求。 3. **自动化**:Kubernetes能够自动部署、重启、复制和扩展容器,确保服务的高可用性和稳定性。 Kubernetes...
本教程通过详细解答课后习题,帮助读者深入理解JavaWeb编程的核心概念和技术。以下是相关知识点的详细说明: 1. **JavaWeb基础**:JavaWeb是基于Java技术的Web应用开发平台,它包括Servlet、JSP(JavaServer Pages...
通信原理习题 第五章 数字信号的基带传输共 4页,第 2页2、已知某数字代码序列对应的 CMI 码基带信号波形如图所示,画出对应的 HDB3 码基带信号的波形,
1~31 题目 + 完整解答代码 1.分秒转换 2.字符串转换为整数 3.最大最小数字的差值 4.列表最后一个元素 5.比较字符串长度 6.字符串首尾连接 7.检查复数单词 8.列表唯一的数字 9.range转为列表 10.素数判断 11.元音...
"百度Android工程师面试题.zip" 这个标题表明这是一份与百度公司面试Android工程师相关的资料集合,通常包含常见的面试问题、技术要点以及可能的解答。这份资料可能涵盖了Android开发的基础到高级知识,旨在帮助应聘...
在第9届全国大学生GIS技能大赛中,下午的试题可能涵盖了GIS技术的多个核心领域,包括空间数据处理、地图制图、空间分析、数据库管理以及GIS应用开发等。 1. **空间数据处理**:这部分可能涉及到矢量数据的编辑和...
- 第四、五题是C语言程序填空,测试考生的结构化编程能力,数据结构和算法运用。 - 第六、七题为C++和Java程序填空,考生需选择一题,用所选语言实现常见设计模式和应用程序。 3. **考试策略**: - 数据流图设计...
2. 初始化计数器CX,这里填充了数字4,因为一个字节由4位二进制组成,我们需要四次循环来转换为十六进制。 3. 使用ROL(rotate left)指令逐位左移BX的内容,每次移位后提取低4位(AND操作)。 4. 检查提取的低4位...
4. BIM设计师斑马的背景:斑马拥有浙江大学建筑系的硕士学历和在国企设计院及上市公司的BIM工作经验,代表作品包括参加第16届威尼斯建筑双年展的华腾猪舍里展厅以及入选2014年Rhino大会的沈阳科技馆幕墙项目。...
这个压缩包包含了第四届蓝桥杯大赛个人赛(软件类)的多个阶段的真题,包括决赛和省赛,特别针对Java高职高专组的学生。以下是对这些真题涉及的知识点的详细解析: 1. **基础语法**:Java的基础语法是所有题目的基石...
在这个压缩包中,我们关注的是"码图C++答案",这意味着里面包含了解答码图问题的C++源代码。 在软件开发和编程竞赛中,C++是一种广泛使用的语言,因其高效、灵活性和丰富的库支持而备受青睐。解答码图问题通常需要...
### 2022年软件评测师上午试题分析与解答 #### 试题(1) **题目**: 在计算机体系结构中,CPU内部涉及程序计数器PC、存储器数据寄存器MDR、指令寄存器IR和存储器地址寄存器MAR等。若CPU要执行的指令为:MOV R0, #...
- 第4题同样是二重积分,但要求是变换积分次序后的结果。 - 第5题涉及到积分次序的转换和积分的计算。 - 第6题涉及微分方程的特解形式,需要根据特征根设定特解的形式。 - 第7题是球面方程的确定,需要知道球心...
在“黑马程序员Python视频中代码、课后习题等第三章内容”这个资源包中,我们聚焦于Python编程语言的学习,特别是围绕第三章的主题展开。Python作为一种高级编程语言,以其简洁明了的语法和强大的功能深受程序员喜爱...
6. **插件**:可能有预装或可选的第三方插件,增强小程序的功能。 7. **其他资源**:如音频、视频等多媒体文件,用于教学辅助。 综上所述,这个基于微信平台的研知识题库小程序提供了丰富的教育资源和测试功能,...
在“黑马程序员Python视频中代码、...这个第二章的学习资源可能包括了上述所有或部分概念的讲解和实践练习,通过观看视频、阅读代码和解答课后习题,你可以深入理解并掌握这些基础知识,为后续章节的学习打下坚实基础。