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调用,布布扣,bubuko.com

时间: 2024-12-20 02:08:04

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

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

本文发表在中国人民解放军"信息工程大学"学报 2001年第3期. ActiveX数据对象之事务控制在VB和DELPHI中的应用                     马根峰1   ,  孙艳2  , 宋伟1                       ( 1.重庆邮电学院 ,重庆,400065 :2. 铁道部第十九工程局四处,通辽,028000  ) 摘要      事务控制是数据库应用系统中的关键技术之一,本文一开始先对事务控制的概念以及微软的 ActiveX数据对象(ADO)的事

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

C# 开发COM组件供c++使用 Microsoft在解决和以往的COM和SDK开发技术之间的互操作性(Interoperability)方面做了很多的工作,其中包括COM和.NET对象之间的相互调用以及.NET如何调用SDK中的Windows库函数. 本文在学习网上资料的基础上,实现用C#开发组件供C++使用的过程. 编程环境:vs2015 (COM组件) vs2005 c++调用 操作系统 win10 一.C#COM组件 1.新建一个C#类库项目:ExcelCom  (原计划做一个EXCEL

UGUI 快捷键创建UGUI组件

  使用NGUI的时候还有xxx快捷键创建, spirte,label,button等等. 在UGUI里面的时候好像是没有快捷键的. 不知道以后多久才能有这个功能.  在家里闲无聊的时候写了一个脚本, 可以方便的创建UGUI组件(Button,Image,Text,InputFile等等) 快捷键列表如下: Text Shift+Alt+L Button Shift+Alt+B Image Shift+Alt+S InputField Shift+Alt+I   代码部分: using Unit

Visual C++ 编写供 VB.Net调用的Dll。

跟我一样,很多初学者确实很难编写出如题的DLL,即使编写出来也经常在调用过程中出现各种问题.我根据摸索写出了一个DLL,编译和调用代码获得通过. 以下举例简单说明,具体还有很多问题我也待继续研究. 1.用Visual C++ 新建一个Win32控制台 DLL项目(记得打钩空项目) 如:MyDll1 2.在头文件添加 Mydll1.h #pragma once #include <iostream> //函数原型 int __stdcall Add(int a, int b); void __s

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

C#创建COM组件

用C##创建COM组件看来是个很简单的功能,但因为此类文章较少,还是有很多不明白的地方需要学习.本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用. 本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用.并附有完整测试通过的代码.该功能总体看来很简单.可是我在第一次用C#做COM的时候,痛不欲生.因为很少有人写这类文章.而且就算有代码也是乱帖.根本是让人误入歧途.后来在C# help上面看一个老外写的文章 (上面有一个完整的SQL SERVER实例),才完成该功能.拿来分享.

OPENSTACK在RHEL7安装;admin创建虚拟机模板供demo使用

首先RHEL7安装,导入镜像,选择第一个安装7.0,接着出现下面的界面,我这安装截图来自虚拟机,真正做实验是在物理机,一般需要内存5个G 选择英文 时间选择上海,software selection选择Server UI(加上图形化界面),设置installation destination最后点击begin installation 重新配置分区 点done,一步步继续,下面截图,来自别人提供,我当时忘记截图了 左边添加root密码,右边创建用户 把勾选的enable取消掉 不注册 OK,等待

用C#创建COM组件全过程

用C#创建COM组件看来是个很简单的功能,但因为此类文章较少,还是有很多不明白的地方需要学习.本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用. 本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用.并附有完整测试通过的代码.该功能总体看来很简单.可是我在第一次用C#做COM的时候,痛不欲生.因为很少有人写这类文章.而且就算有代码也是乱帖.根本是让人误入歧途.后来在C# help上面看一个老外写的文章 (上面有一个完整的SQL SERVER实例),才完成该功能.拿来分享. 开

unigui组件中client javascript delphi组件之间的操作

UniLabel组件: function OnClick(sender, e){ MainForm.UniLabel1.setText('Click!');} function Onmousemove(sender, x, y){ MainForm.UniLabel1.setPosition(x, y);} unibutton组件: function OnMouseout(sender, e){ sender.setText('Out');} uniedit组件 function form.On