找到个不(少)用重启IIS就能调试新dll的方法,增加例子下载
金蝶云社区-zhouyi5362
zhouyi5362
0人赞赏了该文章 6,616次浏览 未经作者许可,禁止转载编辑于2014年05月21日 16:46:57

用的就是微软的MEF技术。
也是刚实现,不知还有什么问题,欢迎大家一起研究。

分2个项目,接口和插件入口一个(A.dll),功能具体实现一个(B.dll)。

编译好后的A丢bin文件夹,A和B丢D:\\Kingdee\\K3Cloud\\WebSite\\bin\\MEF\\,可自定义。

要修改具体实现的代码,直接重新编译dll后,再放进D:\\Kingdee\\K3Cloud\\WebSite\\bin\\MEF\\就行。保证该文件夹内只有一个实现就可以了。

不过有些缺陷,请大家帮忙解决。

比如我有两个具体实现B.dll和C.dll。

B.dll输出hello1,C.dll输出hello2。

无论我放B.dll进去还是放C.dll进去(要删除另一个具体实现,不然当前代码下会报错,可以修改为importmany,具体大家一起研究吧),都能正确输出。

但如果我重新编译B.dll输出hello3,放进去,运行,还是显示hello1。必须重新换一个dll名(项目属性里面改)才行。大家看看如何解决?

表单调用的是DLL的容器。
[code]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Bill.PlugIn.Args;

namespace K3_MEF_test
{
[Description("MEF插件")]
public class MEFdemo : AbstractBillPlugIn
{
[Import(typeof(IBillPlugIn))]
public IBillPlugIn plugin;

private CompositionContainer _container;

private void Init()
{
var catalog = new AggregateCatalog();
catalog.Catalogs.Add(new DirectoryCatalog("D:\\Kingdee\\K3Cloud\\WebSite\\bin\\MEF\\"));
_container = new CompositionContainer(catalog);
this._container.ComposeParts(this);
}

public override void ButtonClick(ButtonClickEventArgs e)
{
Init();
base.ButtonClick(e);
plugin.ButtonClick(this, e);
}
}
}[/code]

接口定义

[code]using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

namespace K3_MEF_test
{
public interface IBillPlugIn
{
void ButtonClick(AbstractBillPlugIn billPlugIn, ButtonClickEventArgs e);
}
}[/code]

接口实现

[code]using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;

namespace K3_MEF_test
{
[Export(typeof(IBillPlugIn))]
public class Addition : IBillPlugIn
{
public void ButtonClick(AbstractBillPlugIn billPlugIn, ButtonClickEventArgs e)
{
billPlugIn.View.ShowMessage("helloworld", MessageBoxType.Notice);
}
}
}[/code]

这几天用下来,感觉还是非常好用的,连发布都不用重启正式系统。
最短流程:修改程序集名称——>编译——>把dll放到指定文件夹,删除该文件夹内的其他具体实现。重新打开表单就ok了,连登出都不需要。
不过为了调试方便,在每个事件里都会重新搜索一下插件,可能效率有些影响,然后全局变量会失效,可以把Init()放到表单初始化里。