C#创建COM组件供VB,PB,Delphi调用
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调用的更多相关文章
- ActiveX数据对象之事务控制在VB和DELPHI中的应用
本文发表在中国人民解放军"信息工程大学"学报 2001年第3期. ActiveX数据对象之事务控制在VB和DELPHI中的应用 ...
- C# 开发COM组件供c++使用
C# 开发COM组件供c++使用 Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用 ...
- 转:Delphi的类与继承(VB与delphi比较)
既然已经做出了com程序用delphi来开发的决定,那当然就要对delphi进行一些深入的了解.有人说delphi是一个用控件堆砌起来的工具,和vb没什么两样:也有人说dephi实际上是面向过程的,他 ...
- 在Salesforce中创建Web Service供外部系统调用
在Salesforce中可以创建Web Service供外部系统调用,并且可以以SOAP或者REST方式向外提供调用接口,接下来的内容将详细讲述一下用SOAP的方式创建Web Service并且用As ...
- HTML5 UI框架Kendo UI Web教程:创建自定义组件(三)
Kendo UI Web包 含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在前面的2篇文章<HTML5 Web app开发工具Ke ...
- HTML5 UI框架Kendo UI Web中如何创建自定义组件(二)
在前面的文章<HTML5 UI框架Kendo UI Web自定义组件(一)>中,对在Kendo UI Web中如何创建自定义组件作出了一些基础讲解,下面将继续前面的内容. 使用一个数据源 ...
- [转载]Windows 7笔记本创建wifi热点供手机上网教程
用智能手机的朋友会发现这样一个问题,智能手机比普通手机上网更耗流量.这是因为智能手机应用(软件)丰富,而且大部分应用都会自动联网.为此,许多人每月包了上百M的流量套餐,但用的时候还是小心翼翼,生怕流量 ...
- C#开发COM组件供其他开发环境或工具调用介绍(转)
由于工作原因涉及到这一块的开发,由于之前并未接触过,所以本篇文章也是在参考了各种资料后,自己实现并通过通过测试之后所整理的备忘录以及一些个人观点. 希望对刚接触这类型开发的朋友有所帮助,若有不足之处还 ...
- UGUI 快捷键创建UGUI组件
使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能. 在家里闲无聊的时候写了一个脚本, ...
随机推荐
- ES5 Object.defineProperty 方法
先看一个例子: var o = {}; o.a = 1; // 等待于: Object.defineProperty(o, 'a', { value: 1, writable: true, confi ...
- 【BZOJ 2791】 2791: [Poi2012]Rendezvous (环套树、树链剖分LCA)
2791: [Poi2012]Rendezvous Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两 ...
- noip 1999 回文数
题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
- 【树链剖分】【dfs序】【LCA】【分类讨论】Codeforces Round #425 (Div. 2) D. Misha, Grisha and Underground
一棵树,q次询问,每次给你三个点a b c,让你把它们选做s f t,问你把s到f +1后,询问f到t的和,然后可能的最大值是多少. 最无脑的想法是链剖线段树……但是会TLE. LCT一样无脑,但是少 ...
- 【状压dp】CDOJ1608 暑假集训
裸的状压的话,很显然……但有一个强大的优化. 就是在枚举决策的时候,固定第一个空位置.可以证明,这样状态数没有减少,但是降低了很多重复访问. 因为你在枚举的时候,总是可以划分为包含第一个空位置的3个位 ...
- 【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫
[题目大意] 有n个数或为奇数或为偶数,现在进行m次操作,每次取出部分求和,告诉你这几次操作选取的数和它们和的奇偶性.如果通过这m次操作能得到所有数的奇偶性,则输出进行到第n次时即可求出答案:否则输出 ...
- 【最大权森林/Kruskal】POJ3723-Conscription
[题目大意] 招募m+n个人每人需要花费$10000,给出一些关系,征募某个人的费用是原价-已招募人中和他亲密值的最大值,求最小费用. [思路] 人与人之间的亲密值越大,花费越少,即求出最大权森林,可 ...
- bzoj 1433: [ZJOI2009]假期的宿舍
1433: [ZJOI2009]假期的宿舍 Description Input Output Sample Input 1 3 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 Sample ...
- ConstraintLayout导读
ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能,可以把ConstraintLayout看成是一个更高 ...
- 【转】Python IDE for Eclipse
原文地址 PyDev is a plugin that enables Eclipse to be used as a Python IDE (supporting also Jython and I ...