[转]C#调用C++类(以COM组件的形式)

如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的类,如果想调用C++类,可以先把C++类封装成COM组件,再由C#来调用。方法如下(以VS2008英文版为例说明)

一、新建一个Visual C++项目,类型为ATL Project,假设项目名为ComProject,直接点Finish即可。

二、在Solution Explorer的ComProject项目名上右击,选择Add->Class,选择ATL Simple Object,在Short name里填上类名(假设为Hello),点Next,按需求进行选择,然后点Finish。

三、切换到Class View视图,在IHello上右击,选择Add->Method,为IHello接口添加一个方法,方法名为SayHello。打开Hello.cpp文件,在SayHello函数里加上MessageBox(NULL, _T("Hello"), _T("Hello"), MB_OK);,主要作测试用。

四、新建一个Visual C#项目,类型为Console Application,假设项目名为ComTest。在ComTest项目名上右击,选择Add Reference->Browse,在ComProject/Debug下找到ComProject.tlb这个文件,选中并点OK。

五、打开Program.cs,把代码改成

using System;
using ComProjectLib;
namespace ComTest
{
    class Program
    {
        static void Main(string[] args)
        {
            HelloClass hello = new HelloClass();
            hello.SayHello();
        }
    }
}

六、在ComTest项目名上右击,选择Set as StartUp Project,把此项目设为启动项目,然后按Ctrl+F5运行即可,如果出现Hello这个消息框,说明调用COM组件成功。

原文链接:C#调用C++类(以COM组件的形式)

VC6用C++调用VS中C#生成DLL/COM的方法和注意事项 先感慨一下,研究这个问题研究了四个工作日才解决,实在是太不容易了,现在很开心很得意,叉会腰哈哈~ 虽然就是一件看起来很简单的事情,我相信你在看到我这篇文章之前也已经看过许多相关文章了,但是很多细节需要注意,哪一步没有做好可能就走入了一个无尽的陷阱绕许多弯路,把我的经验分享出来如果能帮助到也遇到相同问题的小伙伴,就真的太好不过了。(我的开发环境:WinXP-VC++6.0 C++ & Wi... 阅读详情

相关推荐

C++创建COM组件及其跨语言调用范例

在现代软件开发中,组件对象模型(Component Object Model,简称COM)是一种软件组件的二进制接口标准,它允许软件组件通过一个共同的接口相互沟通。作为微软的一个基础架构,COM在Windows操作系统上广泛应用于多种编程语言之间,提供了语言无关性,被广泛用于Windows系统程序设计中,使得不同语言编写的程序能够互相协作。COM接口是通过虚拟函数表(virtual function table,V-table)实现的,它规定了组件如何与外界进行交互,如何被其他组件或者客户端调用

weixin_31860973的博客 1014

C#调用C++COM组件

前一阵在工作中做项目的时候,遇到了COM组件调用和使用问题,当时研究和好一阵,才把中间的环节打通,现在写出来为大家提供方便,这里包含了四个型: 1、在VS2005中,C#编写DLL并使用C++调用 2、在VS2005中C#编写的COM组件,使用VC6.0调用 3、在VC6.0中编写COM组件,使用VS2005 C#调用 4、在VC6.0中编写COM组件,使用VC6.0调

Sayesan的专栏 2784

C#调用C++(以COM组件形式

如果想用C#调用C/C++写的函数,可以先将C/C++的函数写成dll文件,由C#用DllImport的方式来调用,但是这种方法无法调用C++写的,如果想调用C++,可以先把C++封装成COM组件,再由C#调用。方法如下(以VS2008英文版为例说明) 一、新建一个Visual C++项目,型为ATL Project,假设项目名为ComProject,直接点...

weixin_38166557的博客 280

C#生成dll给c++调用 方法二COM方式 vs2022 NO Make Assembly COM-Visible选错了 不需要clr

有些C++项目中也用了C语言.c,用方法一就无法使用【不能使用 /clr 选项编译 C 文件】。就用方法2。

chenhao0568的专栏 696

C#调用C++的dll两种方法(托管与非托管)

C#调用C++的方式分为两种:(1)非托管的方式进行调用;(2)采用托管的方式进行调用。 一、使用非托管调用C++的dll。 1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include  #include  extern "C" _ _declspec(dllexport) void Sho

liyuqian199695的博客 5万+

com调用的几种方法 及 C#调用C++编写的的COM DLL

一、COM调用的方法5则:1,先注册comRequirement:1.创建myCom.dll,该COM只有一个组件,两个接口IGetRes--方法Hello(),   IGetResEx--方法HelloEx()2.在工程中导入组件型库   #import "组件所在目录myCom.dll" no_namespace        或   #import "型库所在目录myCom.t

孤身我路 1407

C++调用C#创建的COM组件

组件基本概念 COMComponet Object Model)组件是微软公司为了计算机工业的软件生产更加符合人的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展到网络环境下;COM与语言平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块。 .

liulv_yan的博客 3663

C++调用C# COM组件

原文地址 http://dearymz.blog.163.com/blog/static/2056574201191295525523/  感谢原作者分享 从C#创建COM,再到C++调用COM。   适合入门及快速应用。 但是环境要求没有介绍,不清楚此发布的COM是否需要调用客户机有framework环境。 写COM调用,是由于写DLL,C++必须使用CLR编译。 ==

AE的专栏 2646

c++ 调用c#dll (2种方式,com组件和clr工程)

c++ 调用c#dll ,com组件和clr工程两种方式分别实现成功

qq_43525389的博客 9095

基于COM组件实现C#调用C++对象过程中的注意事项

需要注意的是,在 ATL 中,IDL(Interface Definition Language) 文件是用来定义 COM 接口的文件,使用 .idl 后缀名的 IDL 文件中可定义了 COM 接口的方法、属性和事件等信息。总的来说,ATL 通过使用多重继承和模板技术来实现 COM 组件的开发,COM 是一种二进制接口标准,它提供了一种编程模型,使得不同的应用程序和组件之间可以相互协作。本人以VS20190为例,通过打开ATL工程文件中的视图,选中所需添加方法或属性的,右键添加即可。

HeyLoong的博客 998

C# 调用Qt 库

因公司大部分底层库使用的Qt 开发,本人比较擅长C# ,且领导计划应用层用C# 而算法层用C++或者Qt,这就出现了混合编程的方式,现对C#的平台调用做一下总结。 公共语音运行库提供了一系列能够使托管代码与非托管代码进行交互的解决方案 主要包含三互操作技术: 1. 平台调用(P/Invoke):主要用于处理在托管代码中调用C库函数以及Win32 API 函数等非托管函数情形。 2.C++ Interop:适用在托管代码与C++ 库、核心算法库之间进行高效、灵活的互操作过程。 3.COM Int

u012761535的博客 1万+

C#编写一个进程外的COM组件示例代码讲解

代码的链接在《用C#编写一个进程外的COM组件》,小技巧:如果你要同时看示例代码和讲解的话,可以用浏览器分别打开示例代码和这篇文章,然后使用Windows提供的纵向平铺窗口功能就可同时看两篇文章了。 TestComVisibleClass.cs里面定义了我们要发布给COM客户程序的.NET对象,由于我们的.NET进程外组件需要调用几个COM库的API,因此在ComHelperClass里面

Donjuan的专栏 3793

关于如何在C#调用C++的DLL,CLR套壳!

当然如果你的dll是那种C的接口,就是声明了extern "C" 的,单纯的某个方法的函数(就是纯粹的在Cpp里面写C语言模式的接口,没有实例化对象,没有面向对象,没有,只有结构体和面向过程),当然你的大概率是不可能以这种形式调用的,至于这样的dll 该怎么去调用,聪明的你肯定已经想到了,在主程序里面有很多似[DllImport "xxx.dll"] extern xxx 的方法,去看吧,那里有你想要的。ok,最恶心的套壳结束了之后,接下来就是调用了。

血色天空的专栏 944

Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件

Qt做大型软件开发技术选型Part2:Qt调用C#编写的COM组件 之前有提到过我们项目部现在正在用Qt重构一个大型软件,现在的情景是这样的: 原先的软件是通过一个C++(CLR)的主程序,调用各种用C#开发的模块和程序,从而实现各种各样的功能。几乎所有的模块需要用到底层功能(比如语音、视频广播等等)都是通过与主框架底层交换消息码的形式发送的。 原来的框架有两个问题,一是因为年代太久了,现在整个...

Andius的博客 306
上一篇: EnumMap demo
下一篇: C语言字符串操作总结大全(超详细)
weixin_34384557
博客等级 码龄10年 5156粉丝 790原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值