zoukankan      html  css  js  c++  java
  • C#创建VC可调用的COM组件

    简述

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

    开发工具:VS2008

              VS2008命令提示符(呵呵,这个你应该可以找到在什么地方吧)

    附:本文适用任何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 就会出来它的窗口。在几个复选框选择最后一个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。这一部就是生成SNK文件。进入VS2008命令提示符。用命令:sn –k MyCom.snk回车。我的在E:\vs2008\vc下面就生成了一个(MyCom.snk)的文件。(你们可以根据自己的命令提示符所在的文件目录下去找)。然后把它COPY到你的工程根目录下。

    六、           打开AssemblyInfo.cs。在里面加入[assembly:AssemblyKeyFile("MyCom.snk")]

    七、           (1)项目属性->应用程序->程序集信息->选中“使程序集COM可见”。(2)项目属性->生成->选中“为COM互操作注册”。

    八、           生成。如果在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 *= p;
        
    int a = 3;
        
    int b = 6;
        
    int c = s->Add(a,b);
        CString str;
        str.Format(
    "%d",c);
        MessageBox(str);
    }

        当弹出一个9,就说明你已经成功了。

     

  • 相关阅读:
    记某农信社面试
    sublime2 c++的一些使用配置
    switch case
    sizeof与strlen的区别 浅谈
    求最大公约数
    Android基础控件——PopupWindow模仿ios底部弹窗
    Android基础控件——ListView实现时间轴效果
    Android基础控件——CardView的使用、仿支付宝银行卡
    Android基础控件——AlertDialog、ProgressDialog实现单选对话框、多选对话框、进度条对话框、输入框对话框
    Android基础——适配安卓6.0新权限系统
  • 原文地址:https://www.cnblogs.com/yubaolee/p/1512374.html
Copyright © 2011-2022 走看看