首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

VS2010使用C#调用非托管C++生成的DLL文件(图文讲解) 背景

背景      项目过程中,有时候你需要调用C#编写的DLL文件,尤其使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。...它是静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用。...extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。...现在来演示下如何利用C#项目来调用非托管C++的DLL,首先创建C#控制台应用程序: ? 7....方法得到调用。  10. 以上的方法只能通过静态方法对于C++中的函数进行调用。那么怎样通过静态方法去调用C++中一个类对象中的方法呢?

2.7K50

C++ this指针:用于成员函数中指向调用该函数的对象

C++中this指针是一个指向当前对象的指针。成员函数中,可以使用this指针来访问调用该函数的对象的成员变量和成员函数。...函数内部,返回的是指向调用该函数的对象的指针。...这里使用了*this来访问调用该函数的对象。 三、作为函数参数的this指针 this指针也可以作为函数参数传递。这种情况下,可以函数内部访问其他对象的成员变量和成员函数。...getName函数内部,使用了this指针访问调用该函数的对象的成员变量name。...四、总结 this指针C++中是一个非常重要的概念,可以用来访问调用该函数的对象,作为返回值返回,或者作为函数参数传递。掌握this指针的使用可以帮助我们更好地编写面向对象的程序。

23340
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++中反射调用.NET(一) 反射调用第一个.NET类的方法

    extern int Multiply(int factorA, int factorB); 详细的过程,可以参考之前我这篇文章:《C#调用C和C++函数的一点区别》 有时候,我们也会有C++调用...,幸好,C++/CLI提供了一个简便的方案使得可以C++中直接编写.NET程序,所以C++/CLI代表托管和本地编程的结合,可以托管代码中直接使用本地代码,也可以反过来,这样结合了C++本地代码的高效性和...注意,本文说的C++反射调用,不是对C++自身进行封装的反射功能,而是C++/CLI代码中反射调用.NET代码,原理上跟你.NET应用中反射调用另外一个.NET的程序集一个道理。....NET字符串类型变量: String^ assemblyFile; 带^符号的变量,C++/CLI中称为 “句柄”对象,用来跟C++本地代码的“指针”相区别。...,在这段代码中,有1个要注意的地方: Func::typeid 这是C++/CLI特殊的语法,表示获取“句柄”类型的类型ID,实际它的结果就Type对象,等同于C#的 typeof

    3.2K100

    C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

    .NET与C++之间传输集合数据 一篇《C++中反射调用.NET(二)》中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...C++中的列表对象list 下面看看完整的C++/CLI反射调用的代码: std::list GetUsers(String^ likeName)...创建泛型List实例 我们使用List来做集合对象C#中,我们可以通过下面的方式得到List泛型的类型,然后进一步创建泛型对象实例: Type t= typeof(List); 但是,对应的C+...C++/CLI中,用nullptr表示空引用,跟C#的null作用一样。...综合对比,C++/CLI中反射调用.NET,比起.NET平台内部反射调用,性能没有很大的差距,所以C++/CLI中反射调用.NET是一个可行的方案。

    9K100

    .Net 框架

    因为不论是C#语言也好,VB.NET语言也好,C++/CLI语言也好,甚至是重新开发的一套以自己的名字缩写命名的语言,只要它期望运行的目标平台是.NET,经过相应的编译器编译之后,所生成的程序集就是由...为了让熟悉C++语言的开发者也能在.NET框架上开发应用程序,微软推出了面向.NET的C++/CLI语言(也叫托管C++),它就是符合CTS的C++改版语言,为了满足CTS规范,它被限制为了只能继承自一个基类...2)C++/CLI又被约束为只能继承自一个基类,换言之,C++中的部分功能被删除了。,就是说,任何语言要符合CTS,其中与CTS不兼容的部分功能都要被舍弃。...即时编译只有方法的第一次调用时发生。回想一下,类型加载程序会为每个方法插入一个存根。...调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。

    1.9K21

    C#图解教程第一章 C#和.NET框架

    1.1 .NET之前  C#发音:see shap  1.1.1 20世纪90年代后期的Windows编程   20世纪90年代后期各语言缺点:    1.纯Win32 API不是面向对象的,而且工作量比...MFC的更发    2.MC是面向对象的,但是他却不一致,并逐渐变得陈旧    3.COM虽然概念简单。...可以程序中使用  1.2.2 大大改进的编程环境   1.面向对象的开发环境    完全面向对象    形成良好的集成环境    为本地程序和分布式系统提供了一致的,面向对象的编程模型    为桌面,...移动,Web开发提供了软件开发接口,涉及的对象范围广   2.自动垃圾收集    CLR有一项服务为GC(Garbage Collector,垃圾收集),"自动管理内存"    自动从内存中删除程序不再访问的对象...更加容易    不需要使用注册表注册,一个程序只需要被复制到目标机器便可以运行    并行执行     允许一个DLL的不同版本同一台机器存在   6.类型的安全性    CLR检查并确保及其他数据对象的类型安全

    1.2K110

    ATL CLR MFC Win32 常规 的区别

    前段时间,帮人改了个项目,里面明明感觉是MFC,但是却调用C#的类函数,用的都是gcnew指针,凭借着对C#的熟悉,一点一点的实验,终于帮人把程序改好了,但是却不知道到底是什么东西,C#和MFC的混合编程...CLR库中的C++颠覆了很多标准C++的传统,甚至可以说,这里的C++不是C++,只是披着C++的皮干其他的事。这里的C++ 更像是C#或者类似的语言。...所以这里不叫C++,而叫做C++/CLI,值得一提的是,有关C++/CLI的部分目前还没有被标准C++接受,最近微软有 关C++/CLI标准化的提案被C++标准化委员会拒绝了。...所以C++/CLI目前还是微软的一家之言。 ATL用于编写COM程序。ATL库貌似也年纪很大了,至少我接触到VC的时候就有它的存在了。...我也不知道,我只知道COM是有16位版本的,Windows升级到32位的时候COM也随着升级到了32位。COM就像一些封装好的类对象一样,通 过封装系统的api,提供一些标准的方法来给你使用。

    1.4K30

    读书笔记 dotnet 的字符串在内存是如何存放

    # 和 C++\CLI 的应用来进行测试 本文将完全采用 .NET 6 进行编写,分别创建 .NET 6 的 C# 控制台程序,和 .NET 6 的 C++\CLI 空项目。...这里需要稍微说明的是 C++\CLI 是通过 C++ 编写的 .NET 应用程序,基于 .NET 运行时运行的程序 C++\CLI 项目里面添加一个叫 Foo 的类,类里面添加一个方法,用来输出字符串的内容...细节请参阅 从C++C++/CLI - feisky - 博客园 另一个细节是咱 .NET 里面的字符串的编码格式都是 Unicode 也就是 U16 编码方式,需要对应到 wchar_t 类型,也需要使用...当然了, C++\CLI 项目里面依然是不推荐使用 iostream 进行输出的 那以上的 PtrToStringChars 是通过什么魔法进行实现的?...C# 项目里面调用刚才定义的 Foo 类型的 Output 代码,方法如下 class Program { static void Main(string[] args)

    70650

    .NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

    什么是跨语言和跨平台 跨语言:即只要是面向.NET平台的编程语言((C#、Visual Basic、C++/CLI、Eiffel、F#、IronPython、IronRuby、PowerBuilder...那么为了vb调用c#的程序集中避免这些因语言的差异性而导致的错误,在编写c#代码的时候 就应该提前知道vb中的这些规则,来应付式的开发。...NET框架组成中定义了异常类型系统,在编译器角度,所有catch捕获的异常都必须继承自System.Exception,如果你要调用一个 由不遵循此规范的语言 抛出其它类型的异常对象(C++允许抛出任何类型的异常...,如C#调用C++代码,C++抛出一个string类型的异常),C#2.0之前Catch(Exception)是捕捉不了的,但之后的版本可以。...提供面向对象的模型,支持 .NET 实现实现各种语言。 定义处理类型时所有语言都必须遵守的一组规则(CLS)。

    95341

    Unity3d:c#,Mono,IL2CPP,托管代码,AOT,JIT

    Mono 跨平台 IL Intermediate Language,中间语言,面向对象的汇编语言 工作流 通过C#编译器mcs,将C#编译为IL(中间语言,byte code) 通过Mono运行时中的编译器将...Unity跨平台的原理 Mono运行时编译器支持将IL代码转为对应平台原生码 IL可以在任何支持CLI,通用语言环境结构)中运行,IL的运行是依托于Mono运行时。...IOS不支持jit编译原因 机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式 托管代码 c#代码生成的IL编码,由虚拟机的JIT编译执行,其中对象无须手动释放,由GC管理 非托管代码...C++/C#中以不安全类型写的代码,虚拟机无法跟踪 托管代码剥离 托管代码剥离过程将分析项目中的程序集,以查找和删除未实际使用的代码。...翻译成IL IL2CPP得到IL转变为C++代码 再由各个平台C++编译器编译成可执行机器码

    53310

    C#图解教程》读书笔记之一:C#和.NET框架

    一、.NET之前的编程世界   C#语言是微软公司的.NET框架上开发程序而设计的,首先作者给大家纠正了一下C#的正确发音:See Sharp(而不是很多人说的什么C井之类的,每次听到C井我都只能呵呵一笑...1.1 20世纪90年代末的Windows编程   这时大多数程序员使用VB、C或C++,一些C/C++程序员使用纯Win32API,但纯Win32API不是面向对象的,而且使用它的工作量很大,比MFC...大多数程序员使用MFC(Microsoft Foundation Class,微软基础类库),MFC是面向对象的,但是它却不一致,并逐渐变得陈旧。...3.2 编译成本机代码   程序的CIL直到它被调用执行时才会被编译成本机代码,在运行时,CLR执行如下图所示的步凑。 ?   ...CLI的众多组成部分中,最重要的是CTS和CLS。CTS(公共类型系统)定义了那些托管代码中一定会使用的类型的特征,而CLS(公共语言规范)详细说明了一个.NET兼容语言的规则、属性和行为。

    72530

    C++中反射调用.NET(二) 定义数据接口 绑定委托方法 使用SOD DTO 对象 将.NET对象转换到C++结构体为何不使用序列化的问题

    反射调用返回复杂对象的.NET方法 定义数据接口 一篇C++中反射调用.NET(一)中,我们简单的介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集的简单方法,今天我们看看如何在C++...在后面的示例中,我们都会通过这种接口对象的方式来传递数据。 绑定委托方法 下面我们来看看如何在C++/CLI中反射调用GetUserByID 这个方法。...虽然方法返回的是IUserInfo,但是对于我们的C++程序端来说,它并不知道IUserInfo这个接口对象,因为此接口没有C++程序端定义,C++程序也没用引用它所在的.NET程序集,所以我们反射调用...所以这里涉及到2个问题: 1,从Object对象取出数据; 2,将数据转换并且赋值给C++本地数据结构 对于第一个问题,我们可以反射DTO对象的属性,然后跟本地数据接口一一对应,但是,本来我们已经反射调用方法了...为何不使用序列化的问题 进行分布式跨平台调用的时候,序列化常常作为一个有效手段被大量使用,但是我们的应用有几个特点: 1,没有分布式,进程内进行不同语言平台调用; 2,不知道反序列化的类型,因为C+

    2.9K70

    C++CLI(一)-C++CLI简介

    随着C++的深入学习Unity与各大C++机器学习类库算法的编写和调用需求,用C++/CLI与Unity的C#之间建立关联性也越来越显得重要(怎么感觉C++是个大坑。。。。。) ?...而CLI模式却大不相同,它涉及到程序集的创建与使用(类似C#的编译过程)。简单来说,不计输入源文件数目的基础,程序集即为单次编译的输出。...句柄在此是一个C++/CLI术语,CLI实际把它称为“引用”,但C++已经有引用了,这是两回事。...一个非引用类(指本地类)中,this是一个实例函数调用时指向对象的指针,可带有const限定符;一个引用类中,则是实例函数调用时指向对象的句柄——此处要再次提醒大家,不允许带有const限定符。...目前的C++/CLI版本中,引用类的对象只能驻留于堆栈或托管堆中,与其他CLI语言不同,C++/CLI可以让你编写能被传递,并通过复制构造函数或 = 操作符赋值的引用类,还可以重载Clone函数,实现虚拟

    2.9K30

    C#开发BIMFACE系列53 WinForm程序中使用CefSharp加载模型图纸1 简单应用

    我的博客《C#开发BIMFACE系列52 CS客户端集成BIMFACE应用的技术方案》中介绍了多种集成BIMFACE到客户端程序中的方案。...它是用C++/CLI编写的。允许开发者.NET应用程序中嵌入Chromium。可以C#或VB或任何其他CLR语言中使用。CefSharp同时提供WPF和WinForms Web浏览器控件实现。...其中 locales 目录下是语言包,删除 zh-CN.pak 之外的所有文件,总文件大小可以减少22M左右。...代码如下: 入口函数中,获取注入的 ChromiumWebBrowser 对象,名称为 _chromeBrowser。...定义一个单独的类,用于CefSahrp组件加载网页之前,将其注入到网页中 (4)WinForm窗体中点击【 C# 调用 JS 方法】按钮。

    2.4K40

    C++CLI 简单介绍

    C++/CLI简介 托管的C++(MC++)饱受诟病的一个地方就是语法格式和普通的编程语言差别很大,很多人都评价为: ugly 和 twisted 语法。...为了改进现有的MC++ ECMA 2003年10月份起动了一个新的工作小组,其任务是为ISO标准的C++CLI之间的交互操作提供一组新的语言扩展。这也就是C++/CLI的由来。...改进前的MC++有如下缺点: 1、 语法格式不雅观,比如很多双下划线的关键字; 2、 托管的C++CLI交互是并不能使用全部的功能,比如在C#或者VB.NET中可以使用 for-each 等语法,而...MC++不可以; 3、 MC++提供不了一些标准C++的语言特性,比如:C++中的模板,和CLI的内存收集(garbage collection); 4、 非托管的指针和托管的引用指针语法都用*表示...Handler 和 C++中的指针的区别如下: 1、 语法 用 ^和*区别; 2、 Handler是建立托管堆上的一个被(CLI)管理的引用,而指针指向一个物理的内存地址; 3、 指针不受垃圾回收器的影响

    1.1K40

    托管C++、C++CLI、CLR

    总而言之,使用托管C++C++程序员编写.NET框架应用程序最好的一种选择,充分理解.NET框架基础,避免了使用其他语言如C#、VB.NET所带来的额外开销。   ...调用过程中,外包类托管的类和未托管的类之间扮演了映射层的角色—— 它让方法调用直接传递到未托管的类中。另外,需要特别指出的是,托管扩展支持对任何未托管的DLL或库的调用。   ...目前只有托管C++及其后继者C++/CLI可以做到无缝整合托管和非托管代码,而在托管代码中调用COM的速度又相当慢,所以经常被用于其他语言和非托管代码之间的桥梁。   ...4、什么是C++/CLI http://baike.baidu.com/view/459502.htm C++/CLI简介http://blog.csdn.net/eric_jo/article/details...delete来删除

    2.8K40

    2019-11-22-C++CLI的Ref和Out使用

    最近在搞C++/CLI,发现经常需要涉及Ref和Out的使用,因此记录下。 ---- C++/CLI 是一种.NET语言,因此其可以像C#一样使用Ref和Out为函数参数进行标识。...首先我们看看Ref,这个是表示对对象的地址进行传递,所以很简单传递一个地址符号即可 ? 我们将这个方法引用到一个C#项目中,可以看到vs帮我们加上了ref关键字 ?...首先我们需要知道的是,CLR层面是没有out这个用法的,他的本质还是ref,只是对于C#等编译器来说,将其设置为out。...所以回到C++/CLI只需要在原来的方法中添加一个[ Runtime::InteropServices::Out ]Attribute即可(注意大小写,这里编译器不会提醒,别问我怎么知道的,都是泪) ?...此外需要注意的一点,如果你的ref或者out参数是由外部方法的参数传入的,需要确保整条链路上的ref或者out一致,否则会出现编译错误 ---- 参考文献: .net - ref and out in C+

    72520

    2019-10-21-C++CLI委托回调

    我们都习惯了c#中使用事件,但是c++中没有默认的事件机制,所以在编写c++/cli时,这将是一个令人困扰的问题 ---- c++中常见的方式是传入一个回调,特定的时机,通过调用回调函数,执行上层的代码...另外常见的回调对象,要求一次实现多个回调函数,这样容易将各个业务的处理都聚集同一个回调对象中,不利于解耦。 c++/cli中,一种可以参考的处理方式是使用一个托管类对非托管的回调类进行封装。...对于DelegateOnFoo来说,他是一个.NET对象,由gcnew生成,通过gc进行内存管理,如果不保留引用则随时可能被gc回收。...而我们传入非托管对象的是其地址,那么一旦委托被回收,则托管部分运行就会出错。...System.Runtime.InteropServices)- Microsoft Docs ---- 本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/C++CLI

    72750

    2019-11-12-C++CLI的枚举C#中看不见

    最近在搞C++/CLI,发现我在其中写的enum居然不见了,这个是怎么回事呢。 ---- 首先我们C++/CLI项目里面建立一个enum ?...当我们将其c#项目中引用时,神奇的事情发生了,这个枚举的枚举值不见了。 ? 现在我们试着给枚举值做一点改变,加一个class ? 枚举又正常了。 ?...实际C++/CLI中我们可以定义两种枚举类型,不加class关键字的是标准C++枚举,加class关键字的是托管枚举或者叫做CLR枚举。...对于C++/CLI来说,作为一种跨边界语言,能够轻松的托管和非托管语言中自由切换,但是对于C#项目(.NET)项目来说,必须使用CLS兼容的托管枚举。...---- 参考文献: visual studio - C++/CLI enum not showing up in C# with reference to C++/CLI project - Stack

    69720
    领券