[原创]实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法
------------(网上流传的C Sharp写插件实是不可行的)
金蝶K3 BOS的插件官方是用VB6编写的,如果
能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用VB.NET 或C# C++.Net来开发BOS的插件(DLL),如果哪位还有比这方法更早的请联系作者,修改首创的宣称
在此先讲几个概念性的问题:
1、 Net类组件与COM组件:VB6开发的ActiveX.dll 可以用regsvr32.exe 注册,它是适合COM规范的东西,.NET开发的类后缀也是dll,可是它们俩不是相同的东西,.NET(VB、C#)开发的DLL是跑在@H_988_301@.netCLR上的中间二进制字节码以及其他一些有自描述功能的元数据组成的,它不符合@H_988_301@COM+规范,金蝶@H_988_301@K/3及@H_988_301@BOS都是用@H_988_301@VB6开发而来的,@H_988_301@EAS那就另当别论了,所以@H_988_301@BOS插件说白了也是@H_988_301@VB6调用符合@H_988_301@COM规范的@H_988_301@DLL,它的原理就是在原程序里(宿主)先导入放在@H_988_301@BOS插件上的@H_988_301@dll然后直接@H_988_301@Byref调用@H_988_301@Public Sub Show(Byval XXX as Object) 来把需要编程的对象传递过来,所以我们要@H_988_301@VB6能调用@H_988_301@.Net的@H_988_301@dll,那怎么办呢?@H_988_301@Visual Studio提供了一个命令行工具,里面有一个叫@H_988_301@regasm.exe的工具帮我们实现这个互通 命令有点汇编的那个@H_988_301@masm!
@H_988_301@
2、 .NET中的强名strong name 说白了就是为了保护你的组件不被破坏,.Net开发的dll想给像com那样被调用那就必须加个强名(数字签名)
’------------------------------------------------------------------------------------------------------------------------------------------
废话少说,照着我详细的步骤来依葫芦画瓢吧
1,打开VS创建一个类 看图1.1
图1.1
说明:注意图上的红线方框,类、类名、所使用的.Net Frame版本为3.5 2.0的也可以,此测试语言我选VB,当然C#也可以,本人是basic的忠实者!
2,进去后在菜单 [项目]>>[添加引用] 处添加 K3ClassEvents.dll 组件(和VB6一样要添加它)如:图2.1
图 2.1
3,以net的方式和规范编写代码,具体可参考BOS资料和VB6的工具栏插件生成的代码稍作修改作为骨架码
图 3.1
详细代码贴出 附件也带原测试工程文件,不包括实际应用功能只作示例
Imports K3ClassEvents
Public @H_404_736@Class MenuBar
'定义 ListEvents 接口. 必须具有的声明,以此来获得事件
@H_404_736@Private @H_404_736@WithEvents m_ListInterface @H_404_736@As ListEvents
@H_404_736@Public @H_404_736@Sub Show(@H_404_736@ByVal oListInterface @H_404_736@As @H_404_736@Object)
'ListEvents 接口实现
m_ListInterface = oListInterface
@H_404_736@Private @H_404_736@Sub Class_Terminate()
'释放接口对象
m_ListInterface = @H_404_736@Nothing
@H_404_736@Private @H_404_736@Sub m_ListInterface_MenuBarClick(@H_404_736@ByVal BOSTool @H_404_736@As K3ClassEvents.BOSTool,@H_404_736@ByRef Cancel @H_404_736@As @H_404_736@Boolean) @H_404_736@Handles m_ListInterface.MenuBarClick
@H_404_736@On @H_404_736@Error @H_404_736@Resume @H_404_736@Next
@H_404_736@Select @H_404_736@Case BOSTool.ToolName
@H_404_736@Case "shangla"
@H_404_736@Dim form @H_404_736@As @H_404_736@New Form
form.Show()
@H_404_736@Case "dizhu"
@H_404_736@Case "config"
MsgBox("此处添加处理config 菜单对象的 Click 事件 config")
@H_404_736@Case "Info"
@H_404_736@Dim strID @H_404_736@As @H_404_736@String
strID = m_ListInterface.DataSrv.ClassType("FNAME")
@H_404_736@Dim strsql @H_404_736@As @H_404_736@String
strsql = m_ListInterface.DataSrv.sqlselectdetail & " where " & m_ListInterface.DataSrv.Filter("filterstring")
@H_404_736@Case @H_404_736@Else
@H_404_736@End @H_404_736@Select
@H_404_736@Private @H_404_736@Sub m_ListInterface_MenuBarInitialize(@H_404_736@ByVal oMenuBar @H_404_736@As K3ClassEvents.MenuBar) @H_404_736@Handles m_ListInterface.MenuBarInitialize
@H_404_736@Try
@H_404_736@Dim oTool @H_404_736@As K3ClassEvents.BOSTool
@H_404_736@Dim oBand @H_404_736@As K3ClassEvents.BOSBand
'*************** 开始新增 BOS 菜单 ***************
oTool = oMenuBar.BOSTools.Add("shangla")
@H_404_736@With oTool
.Caption = "上拉"
.TooltipText = "上拉源单据"
.Description = "上拉"
.ShortcutKey = 0
.Visible = @H_404_736@True
.Enabled = @H_404_736@True
.BeginGroup = @H_404_736@True
.ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/makequery.ico"
.SetPicture(0,0)
@H_404_736@End @H_404_736@With
oBand = oMenuBar.BOSBands("BandToolBar")
oBand.BOSTools.InsertBefore("mnuBackData",oTool) '将菜单对象插入指定工具栏
oTool = oMenuBar.BOSTools.Add("dizhu")
@H_404_736@With oTool
.Caption = "斗地主"
.TooltipText = "来休闲一下吧"
.Description = "斗地主"
.ShortcutKey = 0
.Visible = @H_404_736@True
.Enabled = @H_404_736@True
.BeginGroup = @H_404_736@True
.ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/icon.ico"
.SetPicture(0,0)
@H_404_736@End @H_404_736@With
oBand = oMenuBar.BOSBands("BandToolBar")
oBand.BOSTools.InsertBefore("mnuBackData",oTool) '将菜单对象插入指定工具栏
oTool = oMenuBar.BOSTools.Add("config")
@H_404_736@With oTool
.Caption = "设置"
.Description = "执行"
.ShortcutKey = 0
.Visible = @H_404_736@True
.Enabled = @H_404_736@True
.BeginGroup = @H_404_736@True
.ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/ProgressSuccess.ico"
.SetPicture(0,0)
@H_404_736@End @H_404_736@With
oBand = oMenuBar.BOSBands("BandToolBar")
oBand.BOSTools.InsertBefore("mnuBackData",oTool) '将菜单对象插入指定工具栏
oTool = oMenuBar.BOSTools.Add("Info")
@H_404_736@With oTool
.Caption = "信息"
.TooltipText = "显关相关信息"
.Description = "信息"
.ShortcutKey = 0
.Visible = @H_404_736@True
.Enabled = @H_404_736@True
.BeginGroup = @H_404_736@True
.ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/server.ico"
.SetPicture(0,0)
@H_404_736@End @H_404_736@With
oBand = oMenuBar.BOSBands("BandToolBar")
oBand.BOSTools.InsertBefore("mnuBackData",oTool) '将菜单对象插入指定工具栏
'*************** 结束新增 BOS 菜单 ***************
@H_404_736@Catch ex @H_404_736@As Exception
MsgBox(ex.Message.ToString)
End @H_404_736@Class
4. 1)进入菜单 [项目]>[xxx属性]>应用程序> 程序集信息 下在 使程序集COM可见 打勾
2) 进入 [项目]>[xxx属性]>编译 下 把 [为COM互操作] 打勾
3) 进入 [项目]>[xxx属性]>签名 下 把[为程序集签名] 打勾 并 <新建…> 一个snk签名 不设密码也可
5,进入VS tools
关键: 用regasm命令注册Net的dll
D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/BOS_ListEvent_PlugIns/BOS_ListEvent_PlugIns/bin/Release> regasm BOS_ListEvent_PlugIns.dll /tlb: TestPlugIns.Net.dll
因为我建了一个窗体 所以多了一个 form这项
有没有看多出工具栏这几项菜单 上拉 斗地主 信息
点[上拉]出现的事件 如下图
Select @H_404_736@Case BOSTool.ToolName
@H_404_736@Case "shangla"
@H_404_736@Dim form @H_404_736@As @H_404_736@New Form
form.Show()
其实可以把从主程序的数据拉到自己建的解决方案下处理,这比VB6强一点,在VB6下试了一下,好像不能显示自己建的窗体,此次为演示测试插件,并无实现任何实际功能,大家撑握.NET做插件后可尽情发挥,本人之后可能没这么多时间接触金蝶了,换了个用用友的公司,其实本人还是挺喜欢K3 BOS的,闲话不说了^_^
如有疑问请联系chzjxgd@21cn.com 或QQ 105670118
附上原工程文件:
2011-2-9 晚