天天看點

實作用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

    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

    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")

                .Caption = "鬥地主"

                .TooltipText = "來休閑一下吧"

                .Description = "鬥地主"

                .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/icon.ico"

            oBand.BOSTools.InsertBefore("mnuBackData", oTool)    '将菜單對象插入指定工具欄

            '新增 config 菜單對象,并設定屬性

            oTool = oMenuBar.BOSTools.Add("config")

            With oTool

                .Caption = "設定"

                .TooltipText = "設定自定義執行的SQL"

                .Description = "執行"

                .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/ProgressSuccess.ico"

            '新增 Info 菜單對象,并設定屬性

            oTool = oMenuBar.BOSTools.Add("Info")

                .Caption = "資訊"

                .TooltipText = "顯關相關資訊"

                .Description = "資訊"

                .ToolPicture = "D:/Documents and Settings/Administrator/My Documents/Visual Studio 2008/Projects/ico/server.ico"

            '*************** 結束新增 BOS 菜單 ***************

        Catch ex As Exception

            MsgBox(ex.Message.ToString)

        End Try

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

網名:浩秦;

郵箱:root#landv.pw;

隻要我能控制一個國家的貨幣發行,我不在乎誰制定法律。金錢一旦作響,壞話隨之戛然而止。