1  COM组件概述

COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

COM组件的优点:

①可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;

②可以在多个应用系统中重复利用同一个组件;

③可以方便的将应用系统扩展到网络环境下;

④COM组件的特性是与语言无关和与平台无关的(最重要的特性)。COM可以被各种不同的语言如Java,C#, PB,VB,Delphi等调用。

2  COM组件实例

2.2 .NET(C#)创建的COM组件及调用过程

.NET(C#)创建的COM组件在VB6.0和VC6.0中以COM组件形式调用,调用“*.tlb”文件;而在VB.NET 和C#中应以.NET程序集形式调用,调用时,直接引用“*.dll”文件即可。

2.1.1 C# 创建COM组件

1、创建C#类库,名称为CLCOMTestInCSharp,如下图

2、在“解决方案资源管理器”(CTRL+W,S)中,类“Class1.cs”更名为“CAdd.cs”,并在弹出的对话框选项中选择“是”。如下图

3、添加接口“IAdd”,并使类“CAdd”继承接口“IAdd”,代码如下

namespace CLCOMTestInCSharp

{

public interface IAdd

{

/// <summary>

/// 加法运算

/// </summary>

/// <param name="num1">整数1</param>

/// <param name="num2">整数2</param>

/// <returns>返回两数字之和</returns>

int Add(int num1, int num2);

}

public class CAdd:IAdd

{

/// <summary>

/// 构造函数

/// </summary>

public CAdd()

{ }

/// <summary>

/// 加法运算

/// </summary>

/// <param name="num1">整数1</param>

/// <param name="num2">整数2</param>

/// <returns>返回两数字之和</returns>

public int Add(int num1, int num2)

{

return num1 + num2;

}

}

}

4、文档最上方添加命名空间“System.Runtime.InteropServices”的引用语句。

using System.Runtime.InteropServices;

5、通过菜单“工具”“创建GUID”创建GUID,如下图

6、“IAdd”接口上方使用该GUID,如下:

[Guid("058B0D56-360E-489c-BF19-567BEBF74C82")]

public interface IAdd

7、同样的方法在类“CAdd”的上方再生成添加一个GUID

[Guid("C6926C48-02CC-44db-8C07-B70F4E11F300")]//类GUID

[ClassInterface(ClassInterfaceType.None)]//不为类生成类接口

public class CAdd:IAdd

8、完整代码如下图

9、打开“解决方案资源管理器”,打开“AssemblyInfo.cs”,将[assembly: ComVisible(false)]设为true。

10、右击该类库项目,选择“属性”“生成”,将“为COM互操作注册”选中。如图

11、右击项目,“生成”。将生成“CLCOMTestInCSharp.dll”、“CLCOMTestInCSharp.tlb”、“CLCOMTestInCSharp.pdb”三个文件

2.2.2 使用VB6.0调用

1、在VB6.0中新建工程“标准EXE”。在窗体上添加一个“CommandButton”控件,并将其Caption属性设为“VB6.0调用C#写的COM组件”

2、在工程引用中选择“CLCOMTestInCSharp”,如下图

3、双击“CommandButton”,为其添加如下代码

Private Sub Command1_Click()

Dim add As CAdd '定义类Add的对象

Set add = New CAdd

Dim num1, num2, num3 As Long '定义变量

num1 = 1

num2 = 2

num3 = 0

num3 = add.add(num1, num2)  'COM组件调用

MsgBox "1+2=" & num3

Set add = Nothing '

End Sub

注意:C#中的int类型,转化到VB中变为long类型

4、执行程序。结果如下图:

2.2.3 使用VC6.0调用

1、新建“MFC AppWizard(exe)”的“基本对话框”工程。并在窗体上添加一个按钮,将其标题设为“使用VC6.0调用C#写的COM组件”

2、将用C#生成的组件“CLCOMTestInCSharp.tlb”拷贝到VC的工程目录和生成目录。

3、添加引用

#import "CLCOMTestInCSharp.tlb"

using namespace CLCOMTestInCSharp;

4、为按钮添加如下代码

long num1,num2,num3;//定义变量

num1=1,num2=2,num3=0;

CoInitialize(NULL);

IAddPtr p_Add(__uuidof(CAdd));

num3 = p_Add->Add(num1,num2);

p_Add.Release();

p_Add = NULL;

CoUninitialize();

CString strTemp;

strTemp.Format("%ld",num3);

MessageBox("1+2="+strTemp);

注意:C#中的int类型,转化到VC中变为long类型

5、运行结果,如下图:

2.2.4 使用.Net(VB)调用

1、使用VB.NET创建“Windows 窗体应用程序”项目,命名为“COMTest”。

2、在窗体上添加一个Button,并将其Text属性设为“使用VB.NET调用C#创建的COM组件”

3、将“CLCOMTestInCSharp.dll”复制到程序目录,添加引用,选择“浏览”,如下图

4、双击“Button”按钮,添加如下代码

Dim add As CLCOMTestInCSharp.CAdd '添加CAdd类的对象

add = New CLCOMTestInCSharp.CAdd

Dim num1, num2, num3 As Integer '定义变量

num1 = 1

num2 = 2

num3 = 0

num3 = add.Add(num1, num2) '调用COM组件

add = Nothing

MessageBox.Show("1+2=" & num3.ToString()) '消息显示结果

5、执行程序,结果如下图所示

2.2.5 使用.Net(C#)调用

1、创建“Windows 窗体应用程序”,并命名为“COMTest”

2、在窗体上添加一个Button,并将其Text属性设为“使用C#调用C#创建的COM组件”

3、将“CLCOMTestInCSharp.dll”复制到程序目录,添加引用,选择“浏览”

4、双击Button为其添加如下代码。

private void button1_Click(object sender, EventArgs e)

{

CLCOMTestInCSharp.CAdd add = new CLCOMTestInCSharp.CAdd();//定义Add类的对象

int num1, num2, num3;//定义变量

num1 = 1; num2 = 2; num3 = 0;//变量初始化

num3 = add.Add(num1, num2);//调用COM

MessageBox.Show("1+2="+num3.ToString());//使用消息显示结果

}

5、执行程序,结果略。

C#创建COM组件供VB,PB,Delphi调用的更多相关文章

  1. ActiveX数据对象之事务控制在VB和DELPHI中的应用

            本文发表在中国人民解放军"信息工程大学"学报 2001年第3期.        ActiveX数据对象之事务控制在VB和DELPHI中的应用             ...

  2. C# 开发COM组件供c++使用

    C# 开发COM组件供c++使用 Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用 ...

  3. 转:Delphi的类与继承(VB与delphi比较)

    既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...

  4. 在Salesforce中创建Web Service供外部系统调用

    在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...

  5. HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)

    Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...

  6. HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)

    在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...

  7. [转载]Windows 7笔记本创建wifi热点供手机上网教程

    用智能手机的朋友会发现这样一个问题,智能手机比普通手机上网更耗流量.这是因为智能手机应用(软件)丰富,而且大部分应用都会自动联网.为此,许多人每月包了上百M的流量套餐,但用的时候还是小心翼翼,生怕流量 ...

  8. C#开发COM组件供其他开发环境或工具调用介绍(转)

    由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...

  9. UGUI 快捷键创建UGUI组件

      使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能.  在家里闲无聊的时候写了一个脚本, ...

随机推荐

  1. JZYZOJ1383 [usaco2003feb]impster 位运算 最短路

    http://172.20.6.3/Problem_Show.asp?id=1383  找能到达某个状态的最小操作数,然后把所有状态扫一遍即可,要额外判定一下起始就有的状态(如果起始里没有0那么这些状 ...

  2. 浅谈OI中的提交答案

    在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...

  3. BZOJ 1123 [POI2008]BLO(Tarjan算法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1123 [题目大意] Byteotia城市有n个towns,m条双向roads. 每条r ...

  4. bzoj 4401: 块的计数

    4401: 块的计数 Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对 ...

  5. Problem C: 指针:自定义函数length,调用它计算字符串的长度

    #include<stdio.h> int length(char*s) { int i,count; while(*s!='\0') { *(s++); count++; } retur ...

  6. 原生js实现Ajax请求

    总的来说,Ajax是与服务器交换数据并更新部分网页的艺术,在不重新加载整个网页的情况下,异步请求数据并刷新页面.举一个小的例子:Goole搜索页面.当用户在输入框输入关键字的时候,JavaScript ...

  7. (Mark)操作系统原理

    Q:什么是中断?A:中断嘛,举个容易理解的例子吧.   比如莲莲和唐唐在下象棋,眼看莲莲就快招架不住了,正当此紧要关头,唐唐的女友来了,非要唐唐陪她上街买衣服不可(唐唐晕倒:-) ),于是唐唐不得不同 ...

  8. 通过LoadBalancerClient获取所有服务列表的IP

    说明:LoadBalanced采用轮训的方式请求服务提供者,但是如果针对某些业务需要精确到某个服务提供者或者遍历所有的服务提供者,那么可以通过LoadBalancerClient去获得. 参考: ht ...

  9. Android网络通信框架LiteHttp2.0 开篇简介和大纲目录

    本帖最后由 移动天宇 于 2015-10-26 10:42 编辑 LiteHttp2.0很多东东焕然一新,旧的能力也得到增强,没有使用的同学来了解一下吧. Android网络框架为什么可以选用lite ...

  10. Android编程实用代码合集

    1.android dp和px之间转换public class DensityUtil { /** * 根据手机的分辨率从 dip 的单位 转成为 px(像素) */ public static in ...