实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法

简介: 转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.

转了这一篇文章,原来一直想用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()

 

 

 

网名:浩秦; 邮箱:root#landv.pw; 只要我能控制一個國家的貨幣發行,我不在乎誰制定法律。金錢一旦作響,壞話隨之戛然而止。
目录
相关文章
|
17天前
|
缓存 算法 安全
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
精选10款C#/.NET开发必备类库(含使用教程),工作效率提升利器!
48 12
|
2月前
|
前端开发 JavaScript 安全
C#一分钟浅谈:Blazor WebAssembly 开发
Blazor WebAssembly 是一个客户端框架,允许开发者使用C#和Razor语法构建Web应用。本文介绍了Blazor WebAssembly的基本概念、常见问题及解决方案,包括路由配置、数据绑定、异步操作、状态管理和性能优化等方面的内容,并分享了一些易错点及如何避免的方法。希望这些内容能帮助你在Blazor WebAssembly开发中少走弯路,提高开发效率。
123 51
|
2月前
|
开发框架 缓存 .NET
C# 一分钟浅谈:Blazor Server 端开发
Blazor Server 是基于 ASP.NET Core 的框架,允许使用 C# 和 Razor 语法构建交互式 Web 应用。本文介绍 Blazor Server 的基本概念、快速入门、常见问题及解决方案,帮助开发者快速上手。涵盖创建应用、基本组件、数据绑定、状态管理、跨组件通信、错误处理和性能优化等内容。
80 1
|
2月前
|
缓存 C# 开发者
C# 一分钟浅谈:Blazor Server 端开发
本文介绍了 Blazor Server,一种基于 .NET 的 Web 开发模型,允许使用 C# 和 Razor 语法构建交互式 Web 应用。文章从基础概念、创建应用、常见问题及解决方案、易错点及避免方法等方面详细讲解,帮助开发者快速上手并提高开发效率。
73 2
|
2月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
2月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
93 3
|
2月前
|
测试技术 Go C#
C#一分钟浅谈:ReSharper 插件增强开发效率
【10月更文挑战第25天】ReSharper 是 JetBrains 开发的一款 Visual Studio 插件,旨在提高 .NET 开发者的生产力。它通过代码分析、重构、导航等功能,帮助开发者避免常见错误,提升代码质量和开发效率。本文将通过具体代码案例,详细介绍 ReSharper 的常见功能及其应用。
59 1
|
2月前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
44 3
|
23天前
|
存储 安全 编译器
学懂C#编程:属性(Property)的概念定义及使用详解
通过深入理解和使用C#的属性,可以编写更清晰、简洁和高效的代码,为开发高质量的应用程序奠定基础。
83 12
|
2月前
|
设计模式 C# 图形学
Unity 游戏引擎 C# 编程:一分钟浅谈
本文介绍了在 Unity 游戏开发中使用 C# 的基础知识和常见问题。从 `MonoBehavior` 类的基础用法,到变量和属性的管理,再到空引用异常、资源管理和性能优化等常见问题的解决方法。文章还探讨了单例模式、事件系统和数据持久化等高级话题,旨在帮助开发者避免常见错误,提升游戏开发效率。
79 4