请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

欣东微医疗技术论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 162|回复: 0

关于pb调用c#编写的com组件总结

[复制链接]

606

主题

736

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
38214
QQ
发表于 2018-3-28 15:35:55 | 显示全部楼层 |阅读模式
关于pb调用c#编写的com组件的总结

做微信支付,公众号支付用js+java已经没什么问题。做到刷卡支付发现前台大部分都是C/S的,比如PB/VB/Delphi等,用pb的
Inet或者ole来调用posturl来实现调用支付APi虽然可行,不过通用性差,想到了用visual studio 2015建立类库的方法来生成Dll,然后注册成
com组件的方式实现。

1 用C#创建COM组件,并能用pb9等调用
在用C#创建COM组件时,一定要记住以下几点:
a所要导出的类必须为公有;
b所有属性、方法也必须为公有;
c要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;
d所有的事件也必须用接口方式;

  (1)新建一个Visual C#解决方案),选择类型“类库”;名称MyCom。
  (2)编写导出接口。
    为了理解方便,仅以一加法操作举例。如下:
[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
public interface MyCom_Interface
{
    [DispId(1)]
    int Add(int a, int b);
}  

Guid为全局唯一标识,可以用VS2015的工具-创建GUID,在几个复选框选择第5个,Registry Format,点击New Guid,然后COPY就行了
[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…

(3)创建事件接口。
[Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),
InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface MyCom_Events
{}  

Guid同上,InterfaceType表示向COM公开的方式,这里选择为以调度的方式向COM公开。

(4)创建具体类:
[Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(MyCom_Events))]
public class Class1 : MyCom_Interface
{
    public int Add(int a, int b)
   {
       return a + b;
   }
}

至此,代码完毕。先把整体代码放在下面(注意引用InteropServices):

using System;
using System.Runtime.InteropServices;
using System.Text;
namespace MyCom
{
    [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
    public interface MyCom_Interface
   {
       [DispId(1)]
       int Add(int a, int b);
   }

    [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyCom_Events
   {
   }

    [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"), ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(MyCom_Events))]
    public class Class1 : MyCom_Interface
   {
        public int Add(int a, int b)
       {
            return a + b;
       }
   }
}  

(5)大家都知道COM是需要注册的。注册时要加密钥文件.SNK。
自动生成:项目属性->签名(signing)->程序集签名(Sign the assembly)。选择创建,文件名为MyCom,密码项不勾选。生成后在AssemblyInfo.cs文件中添加了[assembly:AssemblyKeyFile("MyCom.snk")]

手动添加:这一部就是生成SNK文件。进入VS2008命令提示符。用命令:sn –k MyCom.snk回车。我的在E:\vs2008\vc下面就生成了一个(MyCom.snk)的文件。(你们可以根据自己的命令提示符所在的文件目录下去找)。然后把它COPY到你的工程根目录下。打开AssemblyInfo.cs。在里面加入[assembly:AssemblyKeyFile("MyCom.snk")]

(6)设置项目为com

(a)项目属性->应用程序->程序集信息->选中“使程序集COM可见”(英文版 - Make assembly Com-Visible )。
(b)项目属性->生成->选中“为COM互操作注册”(英文版 - Register for COM interop)。

(7)生成。
如果在Debug下有一个MyCom.tlb,那就成功了(肯定还有MyCom.dll)要此tlb文件是为了在VC6.0里面测试。

2 关于注册com组件
   注册com组件网上查有32和64的问题,不过我没有用regsvr32来注册,使用了regasm,这个是.net下注册COM组件的命令,不是windows中注册控件的命令。
   用管理员权限启动DOS窗口,DOS 命令如下:
       regasm /codebase d:\my_proj\1\MyCom.dll
   提示如下错误:
    “MyCom”不是有效的.net程序集,原因是本机安装了多个版本的.net framework
       c:\windows\Microsoft.NET\Framework下居然有
            v1.0.3705  v1.1.4322   v2.0.50727  v3.0 v3.5 v4.0.30310
       一串版本的目录,考虑是vs2015开发的,目标平台是V4.0,进入v4.0.30310目录
       再次运行regasm /codebase d:\my_proj\1\MyCom.dll 注册成功

3查询注册是否成功
   运行regedit打开注册表,查找MyCom,最后找到MyCom.Class1,说明注册成功了。

4 用pb9调用com组件
string c
int   intValue   
oleobject   objOle   
objOle=create   OLEObject   
intValue=objOle.connecttonewobject("MyCom.Class1")
c=string(objOle.Add(9,9))
messagebox("结果",c)

运行后显示18


5 用vb6调用com组件
a. VB6调用环境必须安装.Net framework 2.0或以上版本,最好是3.5(和VS2008相同的framework);
b. 复制dll文件进入VB6环境的目标文件夹,例如D:根目录, D:\MyCom.dll
c. 在Dos命令窗口用regasm命令注册这个dll文件生成.tlb文件
    regasm D:\MyCom.dll /tlb:\MyCom.tlb /codebase
在D:\将会生成一个MyCom.tlb文件
d.在Dos命令窗口用gacutil命令添加Dll文件到GAC中(全局程序集缓存),这样这个Dll文件在这个PC中就可以随处使用
gacutil /I D:\MyCom.dll
e.在VB6项目中,把生成的.tlb文件加入到项目(References)
f. VB6代码即可调用tlb文件

Private Sub Command1_Click()
  Dim obj As New t0426a.Class1
  Form1.Label1.Caption = obj.GetString()
End Sub

注意:以上3,4步,需要在VB6环境的C:\WINDOWS\system32下面有相应的exe文件才可运行;第4步,可以省去;

还要说明的是,当转移这个VB6生成的exe程序(这个VB6可执行文件引用了C#的dll)到另外一台电脑上的时候,需要把这个C# Dll文件一同Copy到那台电脑上,并且重新执行第3步的注册生成tlb文件的工作,否则这个exe程序无法运行。
  


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|eastwill.org ( 辽ICP备17018600号

GMT+8, 2018-4-24 18:45 , Processed in 0.025943 second(s), 9 queries , Apc On.

Powered by Eastwill! X3.2

© 2001-2013 Eastwill Inc.

快速回复 返回顶部 返回列表