如何构建德育体系框架思路一个插件框架

12.插件-Grails开源框架
返回>>Grails提供了许多扩展点来满足你的扩展,包括从命令行接口到运行时配置引擎。以下章节详细说明了该如何着手来做这些扩展。
创建插件创建一个Grails插件,只需要运行如下命令即可:
grails create-plugin [PLUGIN NAME]根据你输入的名字将产生一插件工程。比如你输入grails create-plugin example,系统将创建一个名为example的插件工程。除了插件的根目录有一个所谓的“插件描述”的Groovy文件外,其他的跟一般的Grails工程结构完全一样。将插件作为一个常规的Grails工程是有好处的,比如你可以马上用以下命令来测试你的插件:
grails run-app
由于你创建插件默认是没有的,因此控制器并不会马上有效,如果你的插件需要控制器,那要创建grails-app/conf/MyUrlMappings.groovy文件,并且在起始位置增加缺省的映射"/$controller/$action?/$id?"()
插件描述文件本身需要符合以GrailsPlugin结尾的惯例,并且将位于插件工程的根目录中。比如:
class ExampleGrailsPlugin {
def version = 0.1
}所有插件的根目录下边都必须有此类并且还要有效,此类中定义了插件的版本和其他各式各样的可选的插件扩展点的钩子(hooks)--即插件预留的可以扩展的接口。通过以下特殊的属性,你还可以提供插件的一些额外的信息:
title - 用一句话来简单描述你的插件
author - 插件的作者
authorEmail - 插件作者的电子邮箱
description - 插件的完整特性描述
documentation - 插件文档的URL
class QuartzGrailsPlugin {
def version = "0.1"
def author = "Sergey Nebolsin"
def authorEmail = ""
def title = "This plugin adds Quartz job scheduling features to Grails application."
def description = '''
Quartz plugin allows your Grails application to schedule jobs to be
executed using a specified interval or cron expression. The underlying
system uses the Quartz Enterprise Job Scheduler configured via Spring,
but is made simpler by the coding by convention paradigm.
def documentation = "http://grails.org/Quartz+plugin"
}插件的安装和发布要发布插件,你需要一个命令行窗口,并且进入到插件的根目录,输入:
grails package-plugin这将创建一个grails-+插件名称+版本的zip文件,以先前的example插件为例,这个文件名是grails-example-0.1.zip。package-plugin命令还将生成plugin.xml,在此文件中包含机器可读的插件信息,比如插件的名称、版本、作者等等。产生了可以发布的插件文件以后(zip文件),进入到你自己的Grails工程的根目录,输入:
grails install-plugin /path/to/plugin/grails-example-0.1.zip如果你的插件放在远程的HTTp服务器上,你也可以这样:
grails install-plugin /plugins/grails-example-0.1.zip在Grails插件的存储仓库(Repository)发布插件更好的发布插件的方式是将其发布到Grails插件的存储仓库,这样通过命令就可以看到你的插件了。
grails list-plugins此命令将列出Grails插件存储库的所有插件,当然了也可以用来查看指定插件的信息:
grails plugin-info [plugin-name]这将输出更多的详细信息,这些信息都是维护在插件描述文件中的。
如果你创建了一个Grails插件并且想发布在官方的存储库中,请联系"G2One 团队" 的成员,他们将为你分配访问的权限。
当你有访问Grails插件存储库的权限时,要发行你的插件,只需要简单执行即可:
grails release-plugin这将自动地将改动提交到SVN和创建标签(svn的tagging),并且通过命令你可以看到这些改动如前所提到的,一个插件除了包含一个插件描述文件外,几乎就是一个常规的Grails应用。尽管如此,当安装以后,插件的结构还是有些许的差别。比如一个插件目录的结构如下:
+ grails-app
+ controllers
+ web-app
+ css从本质上讲,当一个插件被安装到Grails工程以后,grails-app下边的内容将被拷贝到以plugins/example-1.0/grails-app(以example为例)目录中,这些内容不会被拷贝到工程的源文件主目录,即插件永远不会跟工程的主目录树有任何接口上的关系。然而,那些在特定插件目录中web-app目录下的静态资源将会被拷贝到主工程的web-app目录下,比如web-app/plugins/example-1.0/js.因此,要从正确的地方引用这些静态资源也就成为插件的责任。比如,你要在GSP中引用一个JavaScript文件,你可以这样:
file="mycode.js" />这样做当然可以,但是当你开发插件并且单独运行插件的时候,将产生相对链接(link)的问题。为了应对这种变化即不管插件是单独运行还是在Grails应用中运行,特地新增一个特别的pluginContextPath变量,用法如下:
file="mycode.js" />这样在运行期间pluginContextPath变量将会等价于/ 或 /plugins/example,这取决于插件是单独运行还是被安装在Grails应用中。在lib和src/java以及src/groovy下的Java、Groovy代码将被编译到当前工程的web-app/WEB-INF/classes下边,因此在运行时也不会出现类找不到的问题。
增加新的脚本在插件的scripts目录下可以增加新的Gant相关的脚本:
+ MyPlugin.groovy
<-- additional scripts here
+ grails-app
+ controllers
+ services
+ lib增加新的控制器,标签库或者服务在grails-app相关的目录树下,可以增加新的控制器、标签库、服务等,不过要注意:当插件被安装后,将从其被安装的地方加载,而不是被拷贝到当前主应用工程的相应目录。
+ ExamplePlugin.groovy
+ grails-app
+ controllers
<-- additional controllers here
+ services <-- additional services here
<-- additional XXX here
+ lib在得以继续查看基于规约所能提供的运行时配置以前,有必要了解一下怎样来评估插件的这些基本规约。本质上,每一个插件都有一个隐含的接口的实例变量:application。GrailsApplication提供了在工程内评估这些规约的方法并且保存着所有类的相互引用,这些类都实现了接口。一个GrailsClass代表着一个物理的Grails资源,比如一个控制器或者一个标签库。如果要获取所有GrailsClass实例,你可以这样:
application.allClasses.each { println it.name }在GrailsApplication实例中有一些特殊的属性可以方便的操作你感兴趣的人工制品(artefact)类型,比如你要获取所有控制器的类,可以如此:
application.controllerClasses.each { println it.name }这些动态方法的规约如下:
*Classes - 获取特定人工制品名称的所有类,比如application.controllerClasses。
get*Class - 获取特定人工制品的特定类,比如application.getControllerClass("ExampleController")。
is*Class - 如果给定的类是指定的人工制品类型,那么返回true, 比如application.isControllerClass(ExampleController.class)。
add*Class - 为给定的人工制品类型新增一个类并且返回新增的GrailsClass实例-比如application.addControllerClass(ExampleController.class)
GrailsClass接口本身也提供了很多有用的方法以允许你进一步的评估和了解这些规约,他们包括:
getPropertyValue - 获取给定属性的初始值
hasProperty - 如果类含有指定的属性,那么返回true
newInstance - 创建一个类的新实例
getName - 如果可以的话,返回应用类的逻辑名称,此名称不含后缀部分
getShortName - 返回类的简称,不包含包前缀
getFullName - 返回应用类的完整名称,包含后缀部分和包的名称
getPropertyName - 将类的名称返回为属性名称
getLogicalPropertyName - 如果可以的话,返回应用类的逻辑属性名称,此名称不包含后缀部分
getNaturalName - 返回属性名称的自然语言的术语(比如将'lastName' 变为 'Last Name')
getPackageName - 返回包的名称
完整的索引请参考 .
安装后进行配置和参与升级操作Grails插件可以在安装完后进行配置并且可以参与应用的升级过程(通过命令),这是由scripts目录下两个特定名称的脚本来完成的:_Install.groovy 和 _Upgrade.groovy。_Install.groovy是在插件安装完成后被执行的,而_Upgrade.groovy是用户每次通过命令来升级他的应用时被执行的。这些是一个普通的脚本,因此你完全可以使用Gant的强大特性。另外pluginBasedir被加入到Gant的标准变量中,其指向安装插件的根目录。以下的_Install.groovy示例脚本将在grails-app目录下创建一个新的目录,并且安装一个配置模板,如下:
Ant.mkdir(dir:"${basedir}/grails-app/jobs")
Ant.copy(file:"${pluginBasedir}/src/samples/SamplePluginConfiguration.groovy",
todir:"${basedir}/grails-app/conf")// To access Grails home you can use following code:
// Ant.property(environment:"env")
// grailsHome = Ant.antProject.properties."env.GRAILS_HOME"
脚本事件将插件和命令行的脚本事件关联起来还是有可能的,这些事件在执行Grails的任务和插件事件的时候被触发。比如你希望在更新的时候,显示更新状态(如"Tests passed", "Server running"),并且创建文件或者人工制品。一个插件只能通过Events.groovy脚本来监听那些必要的事件。更多详细信息请参考
Grails提供了很多的钩子函数来处理系统的不同部分,并且通过惯例的形式来执行运行时配置。跟Grails的Spring配置进行交互首先你可以使用doWithSpring闭包来跟Grails运行时的配置进行交互,例如下面的代码片段是取自于Grails核心插件的一部分:
import org.springframework.web.servlet.i18n.CookieLocaleR
import org.springframework.web.servlet.i18n.LocaleChangeI
import org.springframework.context.support.ReloadableResourceBundleMessageSclass I18nGrailsPlugin { def version = 0.1 def doWithSpring = {
messageSource(ReloadableResourceBundleMessageSource) {
basename = "WEB-INF/grails-app/i18n/messages"
localeChangeInterceptor(LocaleChangeInterceptor) {
paramName = "lang"
localeResolver(CookieLocaleResolver)
})的解析和切换,它是通过语法来完成的。参与web.xml的生成Grails是在加载的时候生成WEB-INF/web.xml文件,因此插件不能直接修改此文件,但他们可以参与此文件的生成。本质上一个插件可以通过doWithWebDescriptor闭包来完成此功能,此闭包的参数是web.xml,是作为XmlSlurper GPathResult类型传入的。考虑如下来自ControllersPlugin的示例:
def doWithWebDescriptor = { webXml ->
def mappingElement = webXml.'servlet-mapping'
mappingElement + {
'servlet-mapping' {
'servlet-name'("grails")
'url-pattern'("*.dispatch")
}此处插件得到最后一个 <servlet-mapping>元素的引用,并且在其后添加Grails' servlet,这得益于XmlSlurper可以通过闭包以编程的方式修改XML的能力。在初始化完毕后进行配置有时候在Spring的被创建以后做一些运行时配置是有意义的,这种情况下,你可以定义doWithApplicationContext闭包,如下例:
class SimplePlugin {
def name="simple"
def version = 1.1
def doWithApplicationContext = { appCtx ->
SessionFactory sf = appCtx.getBean("sessionFactory")
// do something here with session factory
}基础知识Grails插件允许你在运行时注册Grails管辖类或者其他类的动态方法,但新的方法只能通过doWithDynamicMethods闭包来增加。对Grails管辖类来说,比如controllers、tag libraries等等,你可以增加方法,构造函数等,这是通过 机制做到的,比如访问每个控制器的的代码如下所示:
class ExamplePlugin {
def doWithDynamicMethods = { applicationContext ->
application.controllerClasses.metaClass.each { metaClass ->
metaClass.myNewMethod = {-> println "hello world" }
}此处我们通过隐含的application对象来获取所有控制器类的MetaClass实例,并且为每一个控制器增加一个myNewMethod的方法。或者,你已经知道要处理的类的类型了,那你只需要在此类的metaClass属性上增加一个方法即可,代码如下:
class ExamplePlugin {
def doWithDynamicMethods = { applicationContext ->
String.metaClass.swapCase = {->
def sb = new StringBuffer()
delegate.each {
sb << (Character.isUpperCase(it as char) ?
Character.toLowerCase(it as char) :
Character.toUpperCase(it as char))
sb.toString()
assert "UpAndDown" == "uPaNDdOWN".swapCase()
}此例中,我们直接在java.lang.String的metaClass上增加一个新的swapCase方法跟ApplicationContext交互doWithDynamicMethods闭包的参数是Spring的ApplicationContext实例,这点非常有用,因为这允许你和该应用上下文实例中的对象进行交互。比如你打算实现一个跟Hibernate交互的方法,那你可以联合着HibernateTemplate来使用SessionFactory实例,代码如下:
import org.springframework.orm.hibernate3.HibernateTemplateclass ExampleHibernatePlugin {
def doWithDynamicMethods = { applicationContext ->
application.domainClasses.metaClass.each { metaClass ->
metaClass.static.load = { Long id->
def sf = applicationContext.sessionFactory
def template = new HibernateTemplate(sf)
template.load(delegate, id)
}另外因为Spring容器具有自动装配和依赖注入的能力,你可以在运行时实现更强大的动态构造器,此构造器使用applicationContext来装配你的对象及其依赖:
class MyConstructorPlugin {
def doWithDynamicMethods = { applicationContext ->
application.domainClasses.each { domainClass ->
domainClass.metaClass.constructor = {->
return applicationContext.getBean(domainClass.name)
}这里我们实际做的是通过查找Spring的原型beans(prototyped beans)来替代缺省的构造器。
监控资源的改变通常来讲,当资源发生改变的时候,监控并且重新加载这些变化是非常有意义的。这也是Grails为什么要在运行时实现复杂的应用程序重新加载。查看如下Grails的ServicesPlugin的一段简单的代码片段:
class ServicesGrailsPlugin {
def watchedResources = "file:./grails-app/services/*Service.groovy"
def onChange = { event ->
if(event.source) {
def serviceClass = application.addServiceClass(event.source)
def serviceName = "${serviceClass.propertyName}"
def beans = beans {
"$serviceName"(serviceClass.getClazz()) { bean ->
bean.autowire =
if(event.ctx) {
event.ctx.registerBeanDefinition(serviceName,
beans.getBeanDefinition(serviceName))
}首先定义了watchedResources集合,此集合可能是String或者String的List,包含着要监控的资源的引用或者模式。如果要监控的资源是Groovy文件,那当它被改变的时候,此文件将会自动被重新加载,而且被传给 onChange闭包的参数 event。event对象定义了一些有益的属性:
event.source - The source of the event which is either the reloaded class or a Spring Resource
event.ctx - The Spring ApplicationContext instance
event.plugin - The plugin object that manages the resource (Usually this)
event.application - The GrailsApplication instance
event.application - GrailsApplication实例
通过这些对象,你可以评估这些惯例,而且基于这些惯例你可以将这些变化适当的应用到ApplicationContext中。在上述的"Services"示例中,当一个service类变化时,一个新的service类被重新注册到 ApplicationContext中。影响其他插件当一个插件变化时,插件不但要有相应地反应,而且有时还会“影响”另外的插件。以Services 和 Controllers插件为例,当一个service被重新加载的时候,除非你也重新加载controllers,否则你将加载过的service自动装配到旧的controller类的时候,将会发生问题。为了避免这种情况发生,你可以指定将要受到“影响”的另外一个插件,这意味着当一个插件监测到改变的时候,它将先重新加载自身,然后重新加载它所影响到的所有插件。看ServicesGrailsPlugin的代码片段:
def influences = ['controllers']观察其他插件如果你想观察一个特殊的插件的变化但又不需要监视插件的资源,那你可以使用"observe"属性:
def observe = ["hibernate"]在此示例中,当一个Hibernate的领域类变化的时候,你将收到从hibernate插件传递过来的事件。
插件经常依赖于其他已经存在的插件,并且也能调整这种依赖。为了做到这点,一个插件可以定义两个属性,首先是dependsOn。让我们看看Grails Hibernate插件的代码片段:
class HibernateGrailsPlugin {
def version = 1.0
def dependsOn = [dataSource:1.0,
domainClass:1.0,
core: 1.0]}如上述示例所演示的,Hibernate插件依赖于4个插件:dataSource,domainClass, i18n,以及 core。根本上讲,这些被依赖的插件将先被加载,接着才是Hibernate插件,如果这些被依赖的插件没有加载,那么Hibernate也不会加载。如果所依赖的插件不能被解析的话,则依赖于此的插件将被放弃并且不会被加载,这就是所谓的“强”依赖。然而我们可以通过使用 loadAfter来定义一个“弱”依赖,示例如下:
def loadAfter = ['controllers']此处如果controllers插件存在的话,插件将在controllers之后被加载,否则的话将被单独加载。插件也可以适应于其他已存在的插件,以Hibernate插件的 doWithSpring闭包代码为例:
if(manager?.hasGrailsPlugin("controllers")) {
openSessionInViewInterceptor(OpenSessionInViewInterceptor) {
flushMode = HibernateAccessor.FLUSH_MANUAL
sessionFactory = sessionFactory
grailsUrlHandlerMapping.interceptors << openSessionInViewInterceptor
}这里,controllers插件如果被加载的话,Hibernate插件仅仅注册一个 OpenSessionInViewInterceptor。变量manager是接口的一个实例,并且提供同其他插件交互的方法,而且 GrailsPluginManager@本身存在与任何一个插件中。  最近由于特殊需要,开始学习插件开发。
以前接触java也算有些时日,但是一直不知道有插件开发这样一种技术路径,本想着这开发工具都给你备好了,直接用不就行了。但是总有些IT工厂,为了要节约成本,开发自己的开发工具,但是又要节省时间,总不能一切都自己来。毕竟开发一个eclipse也要很长时间的。因此,插件开发出现在历史舞台。
  首先要了解插件开发,就得从SWT/JFACE说起了。SWT是一种开源的界面开发框架,以前学java的时候,总是用一些panel,就类似这个。JFace又是一种基于SWT的UI不见的API。Eclipse就是用这个开发出来的,它提供了Eclipse强大的扩展性,因此可以让用户任意的插入自己想要的插件,开发自己的IDE。
  下面就直接弄一个简单的插件吧!
首先认识一下Eclipse,这个大家应该很熟了!
  1 红色部分是我们的工具栏
  2 蓝色部分是视图
  3 黄色部分是编辑器
  通常我们使用编辑器,进行代码操作,或者业务操作。在视图,进行一些资源的查看等。红色引入一些常用的功能,辅助我们的操作。
我们先做一个简单的工具栏的控件,了解一下eclipse的插件开发流程!
  1 新建一个插件工程
  2 创建自己的插件名字,这个名字最好特殊一点,一遍融合到eclipse的时候,不会发生冲突。
  首先,写入自己的插件名字。
  source folder 是插件的代码路径。
  output folder是插件输出的目标路径。
  下面是开发插件的eclipse的版本。
  3 下一步,进行插件的具体详情设置
ID 是插件的标识
version 是插件的版本
Name是插件的名字
Provider是开发者的信息
下面的Activator,是插件的激活类,用来管理插件的生命周期。
最后是选择是否开发RCP,富客户端应用,暂且不用,选否就行了。
  4 使用插件模板,创建一个插件工具
选择hello world.这是一个工具栏的按钮。
&5 下一步,进行按钮的信息设置。
  默认会生成类的名字,路径(包名),以及工具栏按钮出发的消息提示。
  6 点击finish,完成插件的创建。
  这样,我们就完成了一个插件的创建,那么看一下,eclipse都为我们生成了什么。
1 导入了插件所需要用到的jar包
2 导入了插件依赖的库
4 插件按钮图片
5 插件的配置信息
  MANIFEST.MF 插件的捆绑信息
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: 我的插件
Bundle-SymbolicName: com.test. singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.test.myplugin.Activator
Bundle-Vendor: xingoo
Require-Bundle: org.eclipse.ui,
org.eclipse.core.runtime
Bundle-ActivationPolicy: lazy
  Name 是我们之前设置的插件名字
  SymblicName 是我们插件的包名
  version 是插件的版本
  Activator 是插件的激活类
  Vendor 是插件开发者的信息
  Bundle 是插件以来的库
  这些信息都对应着插件的overview页面的信息。
  plugin.xml 插件的详细设置文档,包含插件的扩展点信息,以及插件自己的信息
&?xml version="1.0" encoding="UTF-8"?&
&?eclipse version="3.4"?&
&extension
point="org.eclipse.ui.actionSets"&
&actionSet
label="Sample Action Set"
visible="true"
id="com.test.myplugin.actionSet"&
label="Sample &Menu"
id="sampleMenu"&
&separator
name="sampleGroup"&
&/separator&
label="&Sample Action"
icon="icons/sample.gif"
class="com.test.myplugin.actions.SampleAction"
tooltip="Hello, Eclipse world"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="com.test.myplugin.actions.SampleAction"&
&/actionSet&
&/extension&
  &plugin&元素清单的主体
  &extension&插件的功能扩展,里面包括 point 扩展点的标识、id 扩展实例的标识、name 提供的用户的名称等等
  build.properties 构建的元素列表
source.. = src/
output.. = bin/
bin.includes = plugin.xml,\
META-INF/,\
  里面包括插件的源文件目录,生成文件目录,还有一些配置信息的引入。
  提供的插件类Activator.java
1 package com.test.
3 import org.eclipse.jface.resource.ImageD
4 import org.eclipse.ui.plugin.AbstractUIP
5 import org.osgi.framework.BundleC
* The activator class controls the plug-in life cycle
10 public class Activator extends AbstractUIPlugin {
// The plug-in ID
public static final String PLUGIN_ID = "com.test.myplugin";
// The shared instance
private static A
* The constructor
public Activator() {
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
public void start(BundleContext context) throws Exception {
super.start(context);
plugin = this;
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
public void stop(BundleContext context) throws Exception {
plugin = null;
super.stop(context);
* Returns the shared instance
* @return the shared instance
public static Activator getDefault() {
* Returns an image descriptor for the image file at the given
* plug-in relative path
* @param path the path
* @return the image descriptor
public static ImageDescriptor getImageDescriptor(String path) {
return imageDescriptorFromPlugin(PLUGIN_ID, path);
  start()和stop()分别用于插件开始与停止调用的函数。
  最后让我们运行一下这个插件吧!
  启动方式1 直接在overview界面点击;
  &启动方式2&也可以点击运行或者DEBUG按钮,运行方式选择Eclipse Application。
  点击启动后,会为我们重新开启一个Eclipse,这个Eclipse就是带有我们创建的插件的新Eclipse。启动效果如下:
  这样一个简单的插件就开发完啦!让我们就此真正的起航吧!!!
阅读(...) 评论()PluginSample 构建插件式的应用程序框架:一个完整的WinForm版的 开发源码和文档,详细介绍了插 CSharp C#编程 238万源代码下载-
&文件名称: PluginSample
& & & & &&]
&&所属分类:
&&开发工具: C#
&&文件大小: 773 KB
&&上传时间:
&&下载次数: 83
&&提 供 者:
&详细说明:构建插件式的应用程序框架:一个完整的WinForm版的插件开发源码和文档,详细介绍了插件开发的过程和原理。-Build a plug-in application frameworks: a complete version of the plug-in development WinForm source code and documentation, detailing the process and the principle of the plug-in development.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&PluginSample\ExternalBin\WeifenLuo.WinFormsUI.Docking.dll&&............\FirstPlugin\bin\Debug\FirstPlugin.dll&&............\...........\...\.....\FirstPlugin.pdb&&............\...........\...\.....\PluginFramework.dll&&............\...........\...\.....\PluginFramework.pdb&&............\...........\...\.....\WeifenLuo.WinFormsUI.Docking.dll&&............\...........\FirstPlugin.cs&&............\...........\FirstPlugin.csproj&&............\...........\FirstPlugin.csproj.user&&............\...........\obj\Debug\DesignTimeResolveAssemblyReferences.cache&&............\...........\...\.....\DesignTimeResolveAssemblyReferencesInput.cache&&............\...........\...\.....\FirstPlugin.csproj.FileListAbsolute.txt&&............\...........\...\.....\FirstPlugin.csproj.GenerateResource.Cache&&............\...........\...\.....\FirstPlugin.dll&&............\...........\...\.....\FirstPlugin.pdb&&............\...........\...\.....\FirstPlugin.PictureView.resources&&............\...........\...\.....\FirstPlugin.PropertyWindow.resources&&............\...........\...\.....\GenerateResource-ResGen.read.1.tlog&&............\...........\...\.....\GenerateResource-ResGen.write.1.tlog&&............\...........\...\.....\ResolveAssemblyReference.cache&&............\...........\...\FirstPlugin.csproj.FileList.txt&&............\...........\PictureView.cs&&............\...........\PictureView.Designer.cs&&............\...........\PictureView.resx&&............\...........\.roperties\AssemblyInfo.cs&&............\...........\PropertyWindow.cs&&............\...........\PropertyWindow.resx&&............\PluginFramework\bin\Debug\PluginFramework.dll&&............\...............\...\.....\PluginFramework.pdb&&............\...............\...\.....\WeifenLuo.WinFormsUI.Docking.dll&&............\...............\DockBar.cs&&............\...............\DockBarService.cs&&............\...............\DocumentViewService.cs&&............\...............\IApplication.cs&&............\...............\IApplicationProvider.cs&&............\...............\IDockBarService.cs&&............\...............\IDocumentView.cs&&............\...............\IDocumentViewService.cs&&............\...............\IMenuService.cs&&............\...............\IPlugin.cs&&............\...............\IPluginService.cs&&............\...............\IToolStripService.cs&&............\...............\MenuService.cs&&............\...............\obj\Debug\DesignTimeResolveAssemblyReferencesInput.cache&&............\...............\...\.....\GenerateResource-ResGen.read.1.tlog&&............\...............\...\.....\GenerateResource-ResGen.write.1.tlog&&............\...............\...\.....\PluginFramework.csproj.FileListAbsolute.txt&&............\...............\...\.....\PluginFramework.csproj.GenerateResource.Cache&&............\...............\...\.....\PluginFramework.dll&&............\...............\...\.....\PluginFramework.pdb&&............\...............\...\.....\PluginFramework.TextView.resources&&............\...............\...\.....\Refactor\PluginFramework.dll&&............\...............\...\PluginFramework.csproj.FileList.txt&&............\...............\PluginConfigurationCollection.cs&&............\...............\PluginConfigurationElement.cs&&............\...............\PluginConfigurationSection.cs&&............\...............\PluginFramework.csproj&&............\...............\PluginFramework.csproj.user&&............\...............\PluginService.cs&&............\...............\.roperties\AssemblyInfo.cs&&............\...............\TextView.cs&&............\...............\TextView.Designer.cs&&............\...............\TextView.resx&&............\...............\ToolBarDockState.cs&&............\...............\ToolStripService.cs&&............\......Sample\App.config&&............\............\bin\Debug\Plugin\FirstPlugin.dll&&............\............\...\.....\......\FirstPlugin.pdb&&............\............\...\.....\......\PluginFramework.dll&&............\............\...\.....\......\PluginFramework.pdb&&............\............\...\.....\......\WeifenLuo.WinFormsUI.Docking.dll&&............\............\...\.....\PluginFramework.dll&&............\............\...\.....\PluginFramework.pdb&&............\............\...\.....\PluginSample.exe&&............\............\...\.....\PluginSample.exe.config&&............\............\...\.....\PluginSample.pdb&&............\............\...\.....\PluginSample.vshost.exe&&............\............\...\.....\PluginSample.vshost.exe.config&&............\............\...\.....\PluginSample.vshost.exe.manifest&&............\............\...\.....\WeifenLuo.WinFormsUI.Docking.dll&&............\............\MainForm.cs&&............\............\MainForm.Designer.cs&&............\............\MainForm.resx&&............\............\obj\Debug\DesignTimeResolveAssemblyReferencesInput.cache&&............\............\...\.....\GenerateResource-ResGen.read.1.tlog&&............\............\...\.....\GenerateResource-ResGen.write.1.tlog&&............\............\...\.....\PluginSample.csproj.FileListAbsolute.txt&&............\............\...\.....\PluginSample.csproj.GenerateResource.Cache&&............\............\...\.....\PluginSample.exe&&............\............\...\.....\PluginSample.MainForm.resources&&............\............\...\.....\PluginSample.pdb&&............\............\...\.....\PluginSample.PluginManagementForm.resources&&............\............\...\.....\PluginSample.Properties.Resources.resources&&............\............\...\.....\ResolveAssemblyReference.cache&&............\............\...\.....\TempPE\Properties.Resources.Designer.cs.dll&&............\............\...\PluginSample.csproj.FileList.txt&&............\............\PluginManagementForm.cs&&............\............\PluginManagementForm.designer.cs&&............\............\PluginManagementForm.resx&&............\............\PluginSample.csproj
&近期下载过的用户:
&&&&&&&&&&[]
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - C#30种对图片的算法,时间,过程可控,算法很精妙,大家可以学习学习。
&[] - 自己开发的C#升降台控制软件源码,希望有利于C#开发朋友。
&[] - .net插件基本框架,可以接到.net平台自身
&[] - 一个功能很强大的插件框架,具有分层结构,用C#代码,.net环境,visual studio2008开发工具写的
&[] - 非常著名的插件库,1.4版本比较稳定,使用该插件库不需要再为如何设计系统的插件结构而烦恼
&[] - 一个类似sharpdevelop的winform全插件框架。但是比它更加灵活,调用插件时既可以基于接口,也可以不基于接口;每一个插件代表一个服务类,一个服务类有多个方法,这一点上与OSGI类似。通过插件配置功能能够将插件注册到界面上,界面元素提供的参数也能很容易的传递到插件内部。更新界面也只在必要的
&[] - vc做的一个进程间通信的程序,包括共享内存,消息传递,消息管道
&[] - winfrom插件机制的实现,完整无BUG。稍加调试即可使用。
&[] - 非常好的winform窗口布局源码,仿vs.net开发界面,可随意拖动、驻留。
&[] - 多线程数据采集器源码 Visual CSharp 2.0

我要回帖

更多关于 前端框架构建 的文章

 

随机推荐