本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用。

附:本文适用任何VS系列工具。

在用C#创建COM组件时,一定要记住以下几点:

1。所要导出的类必须为公有;

2。所有属性、方法也必须为公有;

3。要导出的属性、方法必须用接口方式;如果没有在接口中声明,即使该方法(属性)为公有,也不能正常导出到COM。但他们可以被别的.NET程序所使用;

4。所有的事件也必须用接口方式;

现在开始正题:

一、新建一个Visual C#工程(习惯这种叫法了,现在应该叫解决方案),

选择类型“类库”;就叫MyCom吧。

二、编写导出接口。

为了大家理解方便,仅以一加法操作举例。如下:

[Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
public interface MyCom_Interface
{
[DispId(1)]
int Add(int a, int b);
}

  

Guid为全局唯一标识,可以用VS2008的命令提示符中输入:用guidgen工具(系统自带)可以产生guid,在几个复选框选择最后一个Registry Format,点击New Guid,然后COPY就行了(以下如有guid的字符串,可用同样操作产生)

[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…

三、创建事件接口。

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

  

Guid同二,不多说

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

四、 创建具体类:

[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;
}
}
}

  

五、大家都知道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")]

六、设置项目为com

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

八、生成。

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

九、在VC里面建一个MFC对话框程序(当然Console程序也一样,我为了看着方便)。建好后,把刚刚生成的MyCom.tlb拷到你的根目录下。

十、选在代码里加入#import "MyCom.tlb",然后编写核心测试代码:(我是在一个Button1按钮里面添加的),如下:

    void CTestDlg::OnButton1()
{
CoInitialize(NULL); //注意初始化
MyCom::MyCom_InterfacePtr p(__uuidof(MyCom::Class1)); //创建智能指针
MyCom::MyCom_Interface *s = p;
int a = 3;
int b = 6;
int c = s->Add(a,b);
CString str;
str.Format("%d",c);
MessageBox(str);
}

  

当弹出一个9,就说明你已经成功用C#创建COM组件了。

程序员的基础教程:菜鸟程序员

C#创建COM组件的更多相关文章

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

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

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

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

  3. UGUI 快捷键创建UGUI组件

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

  4. 动态创建angular组件实现popup弹窗

    承接上文,本文将从一个基本的angular启动项目开始搭建一个具有基本功能.较通用.低耦合.可扩展的popup弹窗(脸红),主要分为以下几步: 基本项目结构搭建 弹窗服务 弹窗的引用对象 准备作为模板 ...

  5. vue通过extend动态创建全局组件(插件)学习小记

    测试环境:nodejs+webpack,例子是看文章的,注释为自己的理解 创建一个toast.vue文件: <template> <div class="wrap" ...

  6. VS2010 C++ 创建COM组件

    1.项目中要使用到com组件,于是了解了一下com,并根据<C#高级编程>中关于com的介绍用vs创建了一下com,用于实验.以下均根据书中的demo做一遍,熟悉一下而已. 2.创建CoM ...

  7. C#创建COM组件供VB,PB,Delphi调用

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

  8. vue.js+koa2项目实战(二)创建 HeadBar 组件

    elementUI界面布局 1.创建 HeadBar 组件 HeadBar.vue <template> <el-row> <el-col :span="2&q ...

  9. 用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具

    用 nodejs 写一个命令行工具 :创建 react 组件的命令行工具 前言 上周,同事抱怨说 react 怎么不能像 angular 那样,使用命令行工具来生成一个组件.对呀,平时工作时,想要创建 ...

随机推荐

  1. Java 实现 RSA 非对称加密

    非对称加密算法:用两个密钥(公钥/私钥)对数据进行加密和解密. 一.原理 非对称加密算法实现机密信息交换的基本过程是: 1)甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开; 2)得到该公用密钥 ...

  2. kafka--通过python操作topic

    修改 topic 的分区数 shiyanlou:bin/ $ ./kafka-topics.sh --zookeeper localhost:2181 --alter --topic mySendTo ...

  3. 数据结构与算法JavaScript描述——队列

    注:澄清一个bug: /** * 删除队首的元素: */ function dequeue(){ return this.dataStore.shift(); } 应该有return:   队列是一种 ...

  4. java代码-----运用endWith()和start()方法

    总结: package com.a.b; //startWith().和endWith()是检查一个字符串是否以一个特定的字符序列开始或结束 public class Sdfs { public st ...

  5. PAT甲级 1002 A+B for Polynomials (25)(25 分)

    1002 A+B for Polynomials (25)(25 分) This time, you are supposed to find A+B where A and B are two po ...

  6. DOM笔录

    文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...

  7. eclipse项目推送git

    引用:http://blog.csdn.net/zongzhankui/article/details/48653731

  8. Android APP压力测试实战

    环境准备: Android SDK Python   压测实战步骤 1.在手机开发者工具中,将USB调试选上 2.确认手机,电脑成功连接(通过adb devices) 3.安装测试app(adb in ...

  9. Python实践练习:生成随机的测验试卷文件

    题目 假如你是一位地理老师,班上有 35 名学生,你希望进行美国各州首府的一个小测验.不妙的是,班里有几个坏蛋,你无法确信学生不会作弊.你希望随机调整问题的次序,这样每份试卷都是独一无二的,这让任何人 ...

  10. 「小程序JAVA实战」springboot的后台搭建(31)

    转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...