插件的简单原理


using IExtendServices;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace 插件的简单原理
{
public class ExtendServices
{
private MenuStrip ms = null;
private RichTextBox txt = null;
public ExtendServices(MenuStrip ms, RichTextBox txt)
{
this.ms = ms;
this.txt = txt;
}
public void Service()
{
string[] plugFilesPath = Directory.GetFiles(Path.Combine(Application.StartupPath, "plugs"), "*.dll");

foreach (string itemPath in plugFilesPath)
{
Assembly ass = Assembly.LoadFrom(itemPath);
//获取所有的公共类型
Type[] assTypes = ass.GetExportedTypes();
//自定义的接口类型
Type itype = typeof(IExtendService);
foreach (Type itemtype in assTypes)
{
if (itemtype.IsPublic && itype.IsAssignableFrom(itemtype) && !itemtype.IsAbstract&&!itemtype.IsInterface)
{
IExtendService service = (IExtendService)Activator.CreateInstance(itemtype);
ToolStripMenuItem editItem = (ToolStripMenuItem)ms.Items[1];

ToolStripItem seritem = editItem.DropDownItems.Add(service.Name);
seritem.Tag = service;
seritem.Click += SerItemMethod;
}
}

}
}

private void SerItemMethod(object sender, EventArgs e)
{
ToolStripItem service = (ToolStripItem)sender;
((IExtendService)service.Tag).Service(txt);
}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CNotePadPlugs
{
public class ToASCII:IExtendServices.IExtendService
{
public string Name
{
get { return "ToASCII"; }
}

public void Service(System.Windows.Forms.RichTextBox txt)
{

string all = txt.Text;
string txtSelected = txt.SelectedText;

if (txtSelected == "")
txtSelected = all;

int index = txt.SelectionStart;//2
if (index == all.Length)
index = 0;
//0
string start = all.Substring(0, index);//2
//1
string upper = all.Substring(index, txtSelected.Length);
char[] chars = upper.ToCharArray();
upper = "";
foreach (char item in chars)
{
upper += (int)item;
}
//2
string end = txt.Text.Substring(index + txtSelected.Length);

txt.Text = start + upper + end;

}
}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IExtendServices
{
public interface IExtendService
{
string Name
{
get;
}
void Service(System.Windows.Forms.RichTextBox txt);
}
}

源文件:http://pan.baidu.com/s/1ntp0XxZ

插件的简单原理,布布扣,bubuko.com

时间: 2024-12-21 13:16:14

插件的简单原理的相关文章

小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理

前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以决心花些时间研究了一下 DroidPlugin 插件框架的原理,以便再出现问题时也能从容应对.打开源码后发现尽是大把大把的 hook.binder.classloader 等等,很难摸清头绪,幸运的是,有很多热心的大神已经对 DroidPlugin 的原理进行了透彻的剖析,文末会有本人对参考文章的致

小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代理真的非常简单,只不过就是实现一个 InvocationHandler 接口重写一下 invoke 方法而已.不错,其实很多看似 high level 的技术都并没有想象中的那么晦涩难懂,只要你肯下定决心去了解它,去认识它,去学习它你就会发现,原来都是可以学得懂的.本篇博文将介绍 DroidPlugin 框架

聊天室刷屏的简单原理实现

在聊天室中,如果我们想要实现刷屏的效果,其实很简单,因为这些我们都可以通过前台的js来完成. 首先,说一下原理,就是通过javascript来模拟文字的输入,来模拟提交按钮的点击.这里要实现这些,首先我们需要浏览器的debug,比如firefox的firebug,或者自带的调试工具也可,或者chrome的console台,ie+8的F12 开发者工具. 下面举个简单的例子: 首先审查元素,找到输入框的id比如:id="postTex"t, 然后找到提交的id或者css,比如 class

【Chrome】Chrome插件开发(一)插件的简单实现

不同浏览器插件开发比较 Chrome的插件开发起来最简单,总体上看没什么新的技术,开发语言就是javascript,web前端工程师能很快上手. Firefox的插件开发则复杂许多,涉及到环境的搭建和一些WEB以外的技术. IE的插件开发就更复杂了,需要熟悉C++和COM技术,当然还要装微软的Visual Studio. 这里有篇老外写的文章,对比Chrome.Opera和Firefox的插件开发的:http://blog.nparashuram.com/2011/10/writing-brow

ASP.NET MVC5 插件机制中插件的简单实现

Autofac 依赖注入 ASP.NET MVC5 插件机制中插件的简单实现 一.前言 由于项目业务复杂,创建了多个插件并把他们放在了不同的项目中,项目使用AutoFac做的IOC:但是主项目可以注入,插件注入失败, 没有为该对象定义无参数的构造函数.下面就一步一步注入插件项目. 二.新建带有插件的项目 参考:ASP.NET MVC5 插件化机制简单实现 项目结构如下图: 三.建立DomainServices类库    新建一个ITestService接口,代码如下: namespace Dom

【UI插件】简单的日历插件(下)—— 学习MVC思想

前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么就应该考虑其它UI库的接入问题 这个意思就是,我们的系统中所有UI插件应该有一些统一行为,我们如果希望统一为所有的插件加一点什么东西,需要有位置可加 这个意味着,可能我们所有的插件需要继承至一个抽象的UI类,并且该类提供了通用的几个事件点 ② 上次做的日历插件虽然说是简单,其耦合还是比较严重的(其实

JQUERY插件JqueryAjaxFileUplaoder----更简单的异步文件上传

异步上传相信大家都做过类似的功能,JqueryAjaxFileUploader为我们提供了更简单的实现和使用方式.不过既然是JQUERY的插件那么它所依赖的环境大家都懂得.JqueryAjaxFileUploader并不华丽,也没有提供美化文件上传控件的css,它并不像jQuery File Upload(喜欢的同学可以去尝试下),提供了美观的样式和专门的图片预览.多任务上传等等, JqueryAjaxFileUploader 所拥有的很简单,只是异步上传文件的功能,当然这并不排除由你亲自为它披

Xcode7使用插件的简单方法&amp;&amp;以及怎样下载到更早版本的Xcode

Xcode7自2015年9上架以来也有段时间了, 使用Xcode7以及Xcode7.1\Xcode7.2的小伙伴会发现像VVDocumenter-Xcode\KSImageNamed-Xcode\HOStringSense-for-Xcode等等一系列的插件不能正常使用了,下面我们就来解决一下该版本Xcode插件使用的办法; (一) Xcode7使用插件的简单方法: 1.首先查看 Xcode 的 UUID,在终端执行: defaults read /Applications/Xcode.app/

java——关于异常处理机制的简单原理和应用

异常处理机制的简单原理和应用 一.Execption可以分为java标准定义的异常和程序员自定义异常2种 (1)一种是当程序违反了java语规则的时候,JAVA虚拟机就会将发生的错误表示为一个异常.这里语法规则指的是JAVA类库内置的语义检查. 例如 int i = 2 / 0 或者 String str = null;str.length(); (2)另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常. 例如 Exceptio