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,就说明你已经成功了。

     

  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/yubaolee/p/1512374.html
Copyright © 2011-2022 走看看