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

前端之家收集整理的这篇文章主要介绍了实现用VB.Net/(C#)开发K/3 BOS 插件的真正可行方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

------------(网上流传的C Sharp插件实是不可行的)

金蝶K3 BOS插件官方是用VB6编写的,如果

能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用VB.NET C# C++.Net来开发BOS插件DLL),如果哪位还有比这方法更早的请联系作者,修改首创的宣称

在此先讲几个概念性的问题:

1、 Net类组件与COM组件:VB6开发的ActiveX.dll 可以用regsvr32.exe 注册,它是适合COM规范的东西,.NET开发的类后缀也是dll,可是它们俩不是相同的东西,.NETVBC#)开发的DLL是跑在@H_988_301@.netCLR上的中间二进制字节码以及其他一些有自描述功能的元数据组成的,它不符合@H_988_301@COM+规范,金蝶@H_988_301@K/3@H_988_301@BOS都是用@H_988_301@VB6开发而来的,@H_988_301@EAS那就另当别论了,所以@H_988_301@BOS插件说白了也是@H_988_301@VB6调用符合@H_988_301@COM规范的@H_988_301@DLL,它的原理就是在原程序里(宿主)先导入放在@H_988_301@BOS插件上的@H_988_301@dll然后直接@H_988_301@Byref调用@H_988_301@Public Sub Show(Byval XXX as Object) 来把需要编程的对象传递过来,所以我们要@H_988_301@VB6调用@H_988_301@.Net@H_988_301@dll,那怎么办呢?@H_988_301@Visual Studio提供了一个命令行工具,里面有一个叫@H_988_301@regasm.exe的工具帮我们实现这个互通 命令有点汇编的那个@H_988_301@masm!

@H_988_301@

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 @H_404_736@Class MenuBar

'定义 ListEvents 接口. 必须具有的声明,以此来获得事件

@H_404_736@Private @H_404_736@WithEvents m_ListInterface @H_404_736@As ListEvents

@H_404_736@Public @H_404_736@Sub Show(@H_404_736@ByVal oListInterface @H_404_736@As @H_404_736@Object)

'ListEvents 接口实现

'注意: 方法必须存在,请勿修改

m_ListInterface = oListInterface

@H_404_736@End @H_404_736@Sub

@H_404_736@Private @H_404_736@Sub Class_Terminate()

'释放接口对象

'注意: 方法必须存在,请勿修改

m_ListInterface = @H_404_736@Nothing

@H_404_736@End @H_404_736@Sub

@H_404_736@Private @H_404_736@Sub m_ListInterface_MenuBarClick(@H_404_736@ByVal BOSTool @H_404_736@As K3ClassEvents.BOSTool,@H_404_736@ByRef Cancel @H_404_736@As @H_404_736@Boolean) @H_404_736@Handles m_ListInterface.MenuBarClick

'TODO: 请在此处添加代码响应事件

@H_404_736@On @H_404_736@Error @H_404_736@Resume @H_404_736@Next

@H_404_736@Select @H_404_736@Case BOSTool.ToolName

@H_404_736@Case "shangla"

'此处添加处理shangla 菜单对象的 Click 事件

@H_404_736@Dim form @H_404_736@As @H_404_736@New Form

form.Show()

@H_404_736@Case "dizhu"

'此处添加处理dizhu 菜单对象的 Click 事件

@H_404_736@Case "config"

MsgBox("此处添加处理config 菜单对象的 Click 事件 config")

@H_404_736@Case "Info"

'此处添加处理Info 菜单对象的 Click 事件

@H_404_736@Dim strID @H_404_736@As @H_404_736@String

strID = m_ListInterface.DataSrv.ClassType("FNAME")

@H_404_736@Dim strsql @H_404_736@As @H_404_736@String

strsql = m_ListInterface.DataSrv.sqlselectdetail & " where " & m_ListInterface.DataSrv.Filter("filterstring")

MsgBox(strsql)

@H_404_736@Case @H_404_736@Else

@H_404_736@End @H_404_736@Select

@H_404_736@End @H_404_736@Sub

@H_404_736@Private @H_404_736@Sub m_ListInterface_MenuBarInitialize(@H_404_736@ByVal oMenuBar @H_404_736@As K3ClassEvents.MenuBar) @H_404_736@Handles m_ListInterface.MenuBarInitialize

@H_404_736@Try

'TODO: 请在此处添加代码响应事件

@H_404_736@Dim oTool @H_404_736@As K3ClassEvents.BOSTool

@H_404_736@Dim oBand @H_404_736@As K3ClassEvents.BOSBand

'*************** 开始新增 BOS 菜单 ***************

'新增 shangla 菜单对象,并设置属性

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

@H_404_736@With oTool

.Caption = "上拉"

.TooltipText = "上拉源单据"

.Description = "上拉"

.ShortcutKey = 0

.Visible = @H_404_736@True

.Enabled = @H_404_736@True

.BeginGroup = @H_404_736@True

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

.SetPicture(0,0)

@H_404_736@End @H_404_736@With

oBand = oMenuBar.BOSBands("BandToolBar")

oBand.BOSTools.InsertBefore("mnuBackData",oTool) '菜单对象插入指定工具栏

'新增 dizhu 菜单对象,并设置属性

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

@H_404_736@With oTool

.Caption = "斗地主"

.TooltipText = "来休闲一下吧"

.Description = "斗地主"

.ShortcutKey = 0

.Visible = @H_404_736@True

.Enabled = @H_404_736@True

.BeginGroup = @H_404_736@True

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

.SetPicture(0,0)

@H_404_736@End @H_404_736@With

oBand = oMenuBar.BOSBands("BandToolBar")

oBand.BOSTools.InsertBefore("mnuBackData",oTool) '菜单对象插入指定工具栏

'新增 config 菜单对象,并设置属性

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

@H_404_736@With oTool

.Caption = "设置"

.TooltipText = "设置自定义执行的sql"

.Description = "执行"

.ShortcutKey = 0

.Visible = @H_404_736@True

.Enabled = @H_404_736@True

.BeginGroup = @H_404_736@True

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

.SetPicture(0,0)

@H_404_736@End @H_404_736@With

oBand = oMenuBar.BOSBands("BandToolBar")

oBand.BOSTools.InsertBefore("mnuBackData",oTool) '菜单对象插入指定工具栏

'新增 Info 菜单对象,并设置属性

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

@H_404_736@With oTool

.Caption = "信息"

.TooltipText = "显关相关信息"

.Description = "信息"

.ShortcutKey = 0

.Visible = @H_404_736@True

.Enabled = @H_404_736@True

.BeginGroup = @H_404_736@True

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

.SetPicture(0,0)

@H_404_736@End @H_404_736@With

oBand = oMenuBar.BOSBands("BandToolBar")

oBand.BOSTools.InsertBefore("mnuBackData",oTool) '菜单对象插入指定工具栏

'*************** 结束新增 BOS 菜单 ***************

@H_404_736@Catch ex @H_404_736@As Exception

MsgBox(ex.Message.ToString)

@H_404_736@End @H_404_736@Try

@H_404_736@End @H_404_736@Sub

End @H_404_736@Class

4. 1)进入菜单 [项目]>[xxx属性]>应用程序> 程序集信息 下在 使程序集COM可见 打勾

2) 进入 [项目]>[xxx属性]>编译 [COM互操作] 打勾

3) 进入 [项目]>[xxx属性]>签名 [为程序集签名] 打勾 <新建…> 一个snk签名 不设密码也可

5,进入VS tools

关键: regasm命令注册Netdll

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 @H_404_736@Case BOSTool.ToolName

@H_404_736@Case "shangla"

'此处添加处理shangla 菜单对象的 Click 事件

@H_404_736@Dim form @H_404_736@As @H_404_736@New Form

form.Show()

其实可以把从主程序的数据拉到自己建的解决方案下处理,这比VB6强一点,VB6下试了一下,好像不能显示自己建的窗体,此次为演示测试插件,并无实现任何实际功能,大家撑握.NET插件后可尽情发挥,本人之后可能没这么多时间接触金蝶了,换了个用用友的公司,其实本人还是挺喜欢K3 BOS,闲话不说了^_^

如有疑问请联系chzjxgd@21cn.com QQ 105670118

附上原工程文件:

2011-2-9

猜你在找的VB相关文章