標籤:type obj 組成 事件 imp ase 適合 獲得 int
轉了這一篇文章,原來一直想用C#做k3的外掛程式開發,vb沒有C#用的爽呀,這篇文章寫與2011年,看來我以前沒有認真去找這個方法呀。
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()
實現用VB.Net/(C#)開發K/3 BOS 外掛程式的真正可行方法