zoukankan      html  css  js  c++  java
  • 本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用。

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

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

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

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

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

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

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

    现在开始正题:

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

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

    二、编写导出接口。

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

    1
    2
    3
    4
    5
    6
    [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)]…

    三、创建事件接口。

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

      

    Guid同二,不多说

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

    四、 创建具体类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [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):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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:vs2008vc下面就生成了一个(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按钮里面添加的),如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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组件了。

  • 相关阅读:
    CODING x 百果园 _ 水果零售龙头迈出 DevOps 体系建设第一步
    Nocalhost 亮相 CD Foundation 国内首届 Meetup,Keith Chan 将出席致辞
    做云原生时代标准化工具,实现高效云上研发工作流
    打造数字化软件工厂 —— 一站式 DevOps 平台全景解读
    WePack —— 助力企业渐进式 DevOps 转型
    CODING Compass —— 打造行云流水般的软件工厂
    Nocalhost —— 让云原生开发回归原始而又简单
    CODING 代码资产安全系列之 —— 构建全链路安全能力,守护代码资产安全
    Nocalhost:云原生开发新体验
    使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14690571.html
Copyright © 2011-2022 走看看