金蝶 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, 0)
- End With
- oBand = oMenuBar.BOSBands("BandToolBar")
oBand.BOSTools.InsertBefore("mnuBackData", 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()
实现用 VB.Net/(C#)开发 K/3 BOS 插件的真正可行方法
来源: http://www.bubuko.com/infodetail-2619559.html