实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶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是跑在.net?CLR上的中间二进制字节码以及其他一些有自描述功能的元数据组成的,它不符合COM+规范,金蝶K/3及BOS都是用VB6开发而来的,EAS那就另当别论了,所以BOS插件说白了也是VB6调用符合COM规范的DLL,它的原理就是在原程序里(宿主)先导入放在BOS插件上的dll然后直接Byref调用Public Sub Show(Byval XXX as Object) 来把需要编程的对象传递过来,所以我们要VB6能调用.Net的dll,那怎么办呢?Visual Studio提供了一个命令行工具,里面有一个叫regasm.exe的工具帮我们实现这个互通 命令有点汇编的那个masm! ? 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 Class MenuBar ? ??? ‘定义 ListEvents 接口. 必须具有的声明,以此来获得事件 ??? Private WithEvents m_ListInterface As ListEvents ? ??? Public Sub Show(ByVal oListInterface As Object) ? ??????? ‘ListEvents 接口实现 ??????? ‘注意: 此方法必须存在,请勿修改 ??????? m_ListInterface = oListInterface ? ??? End Sub ? ??? Private Sub Class_Terminate() ? ??????? ‘释放接口对象 ?? ?????‘注意: 此方法必须存在,请勿修改 ??????? m_ListInterface = Nothing ? ??? End Sub ? ??? Private Sub m_ListInterface_MenuBarClick(ByVal BOSTool As K3ClassEvents.BOSTool,ByRef Cancel As Boolean) Handles m_ListInterface.MenuBarClick ? ??????? ‘TODO: 请在此处添加代码响应事件 ??????? On Error Resume Next ? ??????? Select Case BOSTool.ToolName ??????????? Case "shangla" ??????????????? ‘此处添加处理shangla 菜单对象的 Click 事件 ??????????????? Dim form As New Form ??????????????? form.Show() ? ??????????? Case "dizhu" ??????????????? ‘此处添加处理dizhu 菜单对象的 Click 事件 ? ??????????? Case "config" ??????????????? MsgBox("此处添加处理config 菜单对象的 Click 事件? config") ? ??????????? Case "Info" ??????????????? ‘此处添加处理Info 菜单对象的 Click 事件 ??????????????? Dim strID As String ??????????????? strID = m_ListInterface.DataSrv.ClassType("FNAME") ? ??????????????? Dim strSQL As String ??????????????? strSQL = m_ListInterface.DataSrv.sqlselectdetail & " where " & m_ListInterface.DataSrv.Filter("filterstring") ??????????????? MsgBox(strSQL) ??????????? Case Else ??????? End Select ? ??? End Sub ? ??? Private Sub m_ListInterface_MenuBarInitialize(ByVal oMenuBar As K3ClassEvents.MenuBar) Handles m_ListInterface.MenuBarInitialize ? ??????? Try ? ?????? ??????????? ‘TODO: 请在此处添加代码响应事件 ? ? ??????????? Dim oTool As K3ClassEvents.BOSTool ??????????? Dim oBand As K3ClassEvents.BOSBand ? ??????????? ‘*************** 开始新增 BOS 菜单 *************** ? ??????????? ‘新增 shangla 菜单对象,并设置属性 ??????????? oTool = oMenuBar.BOSTools.Add("shangla") ??????????? With oTool ??????????????? .Caption = "上拉" ??????????????? .TooltipText = "上拉源单据" ??????????????? .Description = "上拉" ??????????????? .ShortcutKey = 0 ??????????????? .Visible = True ??????????????? .Enabled = True ??????????????? .BeginGroup = True ??????????????? .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/makequery.ico" ??????????????? .SetPicture(0,0) ??????????? End With ??????????? oBand = oMenuBar.BOSBands("BandToolBar") ????????? ??oBand.BOSTools.InsertBefore("mnuBackData",oTool)??? ‘将菜单对象插入指定工具栏 ? ? ??????????? ‘新增 dizhu 菜单对象,并设置属性 ??????????? oTool = oMenuBar.BOSTools.Add("dizhu") ??????????? With oTool ??????????????? .Caption = "斗地主" ??????????????? .TooltipText = "来休闲一下吧" ??????????????? .Description = "斗地主" ??????????????? .ShortcutKey = 0 ??????????????? .Visible = True ??????????????? .Enabled = True ??????????????? .BeginGroup = True ??????????????? .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/icon.ico" ??????????????? .SetPicture(0,0) ??????????? End With ??????????? oBand = oMenuBar.BOSBands("BandToolBar") ??????????? oBand.BOSTools.InsertBefore("mnuBackData",oTool)??? ‘将菜单对象插入指定工具栏 ? ??????????? ‘新增 config 菜单对象,并设置属性 ??????????? oTool = oMenuBar.BOSTools.Add("config") ?? ?????????With oTool ??????????????? .Caption = "设置" ??????????????? .TooltipText = "设置自定义执行的SQL" ??????????????? .Description = "执行" ??????????????? .ShortcutKey = 0 ??????????????? .Visible = True ??????????????? .Enabled = True ??????????????? .BeginGroup = True ??????????????? .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/ProgressSuccess.ico" ??????????????? .SetPicture(0,oTool)??? ‘将菜单对象插入指定工具栏 ? ??????????? ‘新增 Info 菜单对象,并设置属性 ??????????? oTool = oMenuBar.BOSTools.Add("Info") ??????????? With oTool ??????????????? .Caption = "信息" ??????????????? .TooltipText = "显关相关信息" ??????????????? .Description = "信息" ??????????????? .ShortcutKey = 0 ??????????????? .Visible = True ??????????????? .Enabled = True ??????????????? .BeginGroup = True ??????????????? .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/server.ico" ??????????????? .SetPicture(0,0) ??????????? End With ? ??????????? oBand = oMenuBar.BOSBands("BandToolBar") ??????????? oBand.BOSTools.InsertBefore("mnuBackData",oTool)??? ‘将菜单对象插入指定工具栏 ? ??????????? ‘*************** 结束新增 BOS 菜单 *************** ? ??????? Catch ex As Exception ??????????? MsgBox(ex.Message.ToString) ??????? End Try ??? End Sub ? End 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 ? ? 6)结束,在BOS开发环境下调用 这个注册后的dll即可 ? ? 因为我建了一个窗体 所以多了一个 form这项 ? 有没有看多出工具栏这几项菜单 上拉 斗地主 信息 点[上拉]出现的事件 如下图 Select Case BOSTool.ToolName ??????????? Case "shangla" ??????????????? ‘此处添加处理shangla 菜单对象的 Click 事件 ??????????????? Dim form As New Form ??????????????? form.Show() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |