C#创建com组件

2023-05-16


     本文详细阐述如何用C#创建COM组件,并能用VC6.0等调用。并附有完整测试通过的代码。废话不多说,下面开始介绍:

开发工具:VS2010

VS2010命令提示符在:开始-所有程序-Visual Studio 2010-Visual Studio Tool-命令提示符 

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

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

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

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

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

一、新建一个Visual C#解决方案,选择类型“类库”;名称为:MyCom。

二、编写导出接口。为了大家理解方便,我仅一加法操作举例。如下:

[csharp] view plain copy print ?
  1. [Guid("51917E6C-87A2-4B70-B1A8-47C47F8007E4")]  
  2.     public interface MyCom_Interface  
  3.     {  
  4.        [DispId(1)]  
  5.         int Add(int param1, int param1);  
  6.     }  
[Guid("51917E6C-87A2-4B70-B1A8-47C47F8007E4")]
    public interface MyCom_Interface
    {
       [DispId(1)]
        int Add(int param1, int param1);
    }
在VS2010的命令提示符中输入:guidgen 就会出来它的窗口。在几个复选框选择 ,点击"新建 Guid",然后"复制"就行了(以下如有guid的字符串,全部同样操作)

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

三、创建事件接口。

[csharp] view plain copy print ?
  1. [Guid("0C807AEC-4223-4A03-95A1-3E3AC065E4B7"),  
  2.     InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]  
  3.     public interface MyCom_Events  
  4.     {  
  5.     }  
[Guid("0C807AEC-4223-4A03-95A1-3E3AC065E4B7"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyCom_Events
    {
    }

Guid同二,不多说

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

四、 创建具体类:

[csharp] view plain copy print ?
  1. [Guid("FE6A8C43-D4B6-4100-BC6B-06333F95A57F"),  
  2.       ClassInterface(ClassInterfaceType.None),  
  3.       ComSourceInterfaces(typeof(MyCom_Events))]  
  4.     public class Class1 : MyCom_Interface  
  5.     {  
  6.         public int Add(int a, int b)  
  7.         {  
  8.             return a + b;  
  9.         }  
  10.     }  
[Guid("FE6A8C43-D4B6-4100-BC6B-06333F95A57F"),
      ClassInterface(ClassInterfaceType.None),
      ComSourceInterfaces(typeof(MyCom_Events))]
    public class Class1 : MyCom_Interface
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
把整体代码放在下面(注意引用InteropServices)

[csharp] view plain copy print ?
  1. using System;  
  2. using System.Runtime.InteropServices;  
  3. using System.Text;  
  4.   
  5. namespace MyCom  
  6. {  
  7.     [Guid("51917E6C-87A2-4B70-B1A8-47C47F8007E4")]  
  8.     public interface MyCom_Interface  
  9.     {  
  10.        [DispId(1)]  
  11.         int Add(int param1, int param1);  
  12.     }  
  13.   
  14.     [Guid("0C807AEC-4223-4A03-95A1-3E3AC065E4B7"),  
  15.     InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]  
  16.     public interface MyCom_Events  
  17.     {  
  18.     }  
  19.   
  20.     [Guid("FE6A8C43-D4B6-4100-BC6B-06333F95A57F"),  
  21.       ClassInterface(ClassInterfaceType.None),  
  22.       ComSourceInterfaces(typeof(MyCom_Events))]  
  23.     public class Class1 : MyCom_Interface  
  24.     {  
  25.         public int Add(int a, int b)  
  26.         {  
  27.             return a + b;  
  28.         }  
  29.     }  
  30. }  
using System;
using System.Runtime.InteropServices;
using System.Text;

namespace MyCom
{
    [Guid("51917E6C-87A2-4B70-B1A8-47C47F8007E4")]
    public interface MyCom_Interface
    {
       [DispId(1)]
        int Add(int param1, int param1);
    }

    [Guid("0C807AEC-4223-4A03-95A1-3E3AC065E4B7"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyCom_Events
    {
    }

    [Guid("FE6A8C43-D4B6-4100-BC6B-06333F95A57F"),
      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回车。我的在D:\Program Files\Microsoft Visual Studio 10.0\VC(就是你VS安装目录下)下面就生成了一个(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按钮里面添加的),如下:


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

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

就介绍到这吧。关于具体的com组件的知识可以查看百度百科: 点击打开链接
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#创建com组件 的相关文章

  • 非 Windows 世界中的 COM?

    希望这个问题不会太含糊 通读 COM 规范和 Don Box 的 Essential COM 书 有很多关于 COM 解决的问题 的讨论 它们听起来都很重要 相关且重要 current https stackoverflow com que
  • Delphi 导入组件 - 类型库与 ActiveX

    我正在尝试在 Delphi 中使用 Microsoft 终端服务主动客户端 我发现我可以通过 创建 COM tlb 文件 导入ActiveX控件 or 导入类型库 他们似乎都提供了相同的 tlb 源文件 两种方法之间有区别吗 Delphi
  • PHP 中的类未注册错误

    我们创建了一个 C 类库程序集 并将其设置为 COM 可见 以便能够从 PHP 调用其方法 这曾经运行良好 但现在我们想将其安装在 Windows Server 2008 服务器上 并且不断遇到 类未注册 错误 为了排除任何依赖性问题 我用
  • Mac OS 中的 COM 相当于什么?

    我是 Mac 编程领域的新手 有人可以告诉我 Mac 中可重用 COM 组件的等效项是什么 以及一些入门资源的链接 创建可重用的类似 COM 的组件并从调用应用程序引用这些组件 吗 谢谢 澄清 我想知道是否存在类似的技术 在操作系统级别受支
  • 访问 MS Access 应用程序中的原始代码

    我一直在尝试查找一些有关访问 MS Access 中的原始代码的信息 我使用 v2007 但可能应该适用于所有版本 举例来说 我想列出应用程序中每个代码隐藏表单和模块中的所有函数并列出它们的参数 你将如何实现这一目标 注意 我当然假设该应用
  • Excel进程的最大数量?

    如果我这样做 例如 for int i 0 i lt 22 i var app new Excel Application 然后创建22个excel进程 但是 如果我这样做 for int i 0 i lt 25 i var app new
  • 在 64 位 Windows 计算机上使用 32 位 com 运行 32 位应用程序

    我有一个使用 C COM 对象的 C 应用程序 两者都构建在 32 位计算机上 现在我必须在 64 位机器上运行它们 我注册了COM对象 在计算机 hkey classes root wow6432node clsid xxx 下的寄存器中
  • 选择com的理由

    我想知道为什么人们会选择 Com 作为他的软件开发 技术 我的第一个想法是机器 编程语言的独立性 你的是啥呢 COM 是 Windows 上自动化和 IPC 的事实上的标准 尽管 Net 已经开始转移焦点 因此有些领域您根本没有 或没有 选
  • 使用 COM 对象的 Python ctypes 和 DLL

    在 Windows 下 我尝试使用第 3 方 DLL SomeLib dll 使用 Python 2 7 用 C 编程ctypes 对于其某些功能 该库使用另一个 COM DLL SomeCOMlib dll 它本身使用其他DLL LibA
  • tlbexp.exe 更改方法名称的大小写

    我有一个相当奇怪的问题 我正在将接口从 C 库导出到 COM 我已启用 使用 COM 注册 项目设置 因此它调用 tlbexp exe 来创建类型库 我们在方法名称上使用驼峰式大小写 我注意到导出的类型库将这些恰好与类名一致的方法更改为 P
  • AxInterop 和 Interop 有什么区别?

    我已将 ocx 添加到 VS 的工具箱中 创建了两个 dll Interop NNN dll AxInterop NNN dll 每一个是什么 两者都需要吗 Interop xxx dll 和 AxInterop xxx dll 分别是引用
  • 如何从 Internet Explorer 嵌入对象访问完整的 Adob​​e Acrobat AcroExch COM API?

    我有以下情况 Windows 7 SP1 32 位上的 Internet Explorer 9 Adobe Acrobat 专业版 10 一个网页 代码如下 鉴于 系统默认的PDF阅读器是Adobe Acrobat Adobe Reader
  • 如何引用所有正在运行的 Excel 应用程序实例(包括隐藏的和没有工作簿的实例)的 COM 对象?

    如何获取每个正在运行的 Excel 应用程序实例的完整引用列表 无论其工作簿数量和可见性状态如何 我知道我可以使用 Windows API 来查找每个 Excel 工作簿窗口 其窗口类名称EXCEL7 让他们的句柄与AccessibleOb
  • 哪个是对的? catch (_com_error e) 还是 catch (_com_error& e)?

    我应该使用哪一个 catch com error e or catch com error e 第二 这是我试图引用萨特的话 按值抛出 按引用捕获 学会catch正确 按值 而不是指针 抛出异常 通过引用捕获它们 通常是const 这是组合
  • 无法访问 VBA 中的 COM 公开方法

    我正在尝试在 VBA 中访问 COM 公开的方法 Problem 我看到所有默认方法 例如GetHashCode GetType and ToString 在 VBA 中但是not那些是 COM 接口的一部分并且专门编写为 COM 可见的
  • tlb 文件是否具有关联架构?

    我有一个 32 位 DLL 旨在通过 com 模型和关联的 tlb 文件进行访问 该 DLL 似乎是 x86 有没有办法从 x64 程序访问这种 DLL tlb 文件与 x86 x64 无关吗 我问这个问题是因为有些功能似乎可以工作 其他功
  • 从delphi应用程序调用.net4.0 com服务器后出现错误异常

    我们正在将代码库从 BDS2006 迁移到 Rad Studio XE 我们发现了一些非常奇怪的行为 如果我们在从 Net4 0 中实现的 COM 服务器创建一些对象后进行无效的浮点运算 即除以零 我们不会没有得到正常异常 即 EDivis
  • 调试错误:在 vc++ 项目中使用 COM 时发生 所需的运行时?

    我为我的工作创建了一个 COM 组件 我也注册了该组件 在我的系统上 我有两个虚拟机工作站 在我的第一个工作站中 它运行良好 在我的第二个工作站中 它显示一个包含消息的错误框该程序需要一段时间并以不寻常的方式关闭 请联系应用程序管理员 我认
  • 如何正确使用和实例化现有预览处理程序

    我正在尝试使用现有的预览处理程序来显示文件的预览 我编写了一个简单的测试程序 以 1 查找给定文件的预览处理程序的 CLSID 2 实例化预览处理程序 3 通过流或文件初始化它 4 在基本窗口上渲染预览 这有效 或多或少 It works
  • 我刚刚在 Visual Basic 中运行的 COM 对象的 CLSID 是什么

    我需要知道我刚刚运行的 COM 对象的 CLSIDCreateObject xxx xxx 我怎么才能得到它 蒂亚 拉法尔 我认为您无法直接从 VB 本身获取该信息 例如 作为调用的副作用或次要结果 CreateObject 但你可以阅读注

随机推荐