实现用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, 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()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我有一个梦想

3D游戏开发之在UE4中创建非玩家角色(NPC)

接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色)。在这个游戏中,当我们靠近NPC时,它们会做出相应的...

2568
来自专栏葡萄城控件技术团队

ASP.NET MVC 5 - 给电影表和模型添加新字段

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。 默认情况下,就像您在...

1988
来自专栏日常学python

python使用异步每秒钟就能下载一张高清大图,快不快?

不知道上篇文章大家学得怎样了,因为这篇文章是利用aiohttp这个库来进行说明的。如果还没有很明白或者还没有看过的话可以去多看看爬虫速度太慢?来试试用异步协程提...

1222
来自专栏美丽应用

Button Mapper:无需Root更改硬件按键映射

1084
来自专栏jiajia_deng

Meteor 1.6.x + Ant Design Table + recompose 实现数据分页效果

2232
来自专栏逸鹏说道

在ASP.NET 5中使用SignalR

题记:SignalR作为ASP.NET中进行Web实时双向通信的组件,在ASP.NET 5中也得到了同步发展。不过,用法和之前还是在细节上有所不同,而资料又相对...

31610
来自专栏NetCore

在Asp.Net Core中使用DI的方式使用Hangfire构建后台执行脚本

最近项目中需要用到后台Job,原有在Windows中我们会使用命令行程序结合计划任务或者直接生成Windows Service,现在.Net Core跨平台了,...

1275
来自专栏逸鹏说道

Linux上访问SQL Server数据库

.NET跨平台之旅:升级至ASP.NET 5 RC1,Linux上访问SQL Server数据库 今天微软正式发布了ASP.NET 5 RC1(详见Announ...

2895
来自专栏张善友的专栏

GridView控件使用经验

   GridView控件是Asp.net 1.1版本流行控件DataGrid的继承者,功能比DataGrid增强不少,但是也有很大的不同啊。将最近使用这个控件...

1909
来自专栏林德熙的博客

WPF 播放 gif

本文告诉大家如何在 WPF 播放 Gif 图片,提供了几个方法进行播放,包括比较性能。

581

扫码关注云+社区