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

C#与C++交互,总体来说可以有两种方法:

  • 利用PInvoke实现直接调用 非托管C+

  • 利用C++/CLI作为代理中间层

一、非托管C++

由于C#编写的是托管代码,编译生成微软中间语言,而C++代码则编译生成本地机器码(这种C++也有叫做本地C++或者非托管C++,VC6.0就是用于开发非托管C++代码的平台),这两种语言进行混合编程就存在一定困难。

比较常用的方法是使用DllImport的方法,这种方法在网上有很多介绍,这里就不详细叙述了。但是用过这种方法的人都知道这种方法对于导出函数还可以但是却没法导出非托管C++类!非常的要命。

extern “C”外部声明,表示函数和变量是按照C语言的方式编译和链接的。

__decspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

extern “C” _declspec(dllexport)的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做的DLL。

二、托管C++ 与 C++/CLI

除了C#、非托管C++外,C系列中还存在一种语言叫做托管C++,这种语言语法上和非托管C++几乎一样,但是却和C#一样编译成为微软中间语言,这样托管C++就可以和C#良好地通信,即可以在C#中使用托管C++类。

另外,托管C++还有两个及其重要的特性就是:

  • 可以调用非托管C++的类和函数!
  • 托管C++的程序集可以嵌套非托管C++编译的机器码!

所以我们的技术路径也就明晰了:C#以托管C++为中介调用非托管C++的类和函数。换句话说也就是用托管C++给非托管C++代码做一个外壳包装供C#调用。

托管C++已经被废弃,C++托管代码的现代扩展叫做C++/CLI

C++/CLI 是微软推出的一个跑在 CLI 上的语言,它的主要特性都包含在名字里了:

C++/CLI 最大的一个优势,是可以直接和原生 C/C++ 代码进行混合编译,使用 C/C++ 的函数和数据结构(被微软称为 mixed mode 编程)。这个优势在进行 .NET 平台和 Native 代码互操作编程时体现的尤其明显。

参考:

常见报错

出现问题:在托管c++项目中的,InvokeCon.cpp中时 写int InvokeCon.AddCli()报错。

应该是命名空间的问题,

尝试在头文件.h中增加 using namespace System;

更多参考

具有 C++/CLI 互操作层的 Windows 桌面应用程序可以移植到 .NET Core

Original: https://www.cnblogs.com/peterYong/p/15462980.html
Author: peterYong
Title: C#调用C++的dll两种方法(托管与非托管)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535222/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C/C++ 回调函数(Callback)& 函数指针

    摘要:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的…

    C++ 2023年5月29日
    053
  • c++中CreateEvent函数

    函数原型: HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset, BOOL…

    C++ 2023年5月29日
    057
  • C++11 并发指南五(std::condition_variable 详解)

    std::condition_variable 是条件变量,更多有关条件变量的定义参考维基百科。Linux 下使用 Pthread 库中的 pthread_cond_*() 函数提…

    C++ 2023年5月29日
    060
  • C++解决share_ptr造成的循环引用

    参考链接:https://blog.csdn.net/yc2zgh1314/article/details/51264963 https://www.cnblogs.com/dua…

    C++ 2023年5月29日
    046
  • c++报错: No viable overloaded ‘=’ 临时变量与引用参数 const

    对于一个函数的参数为引用,如果想接收临时变量,就必须加上 const。 class A{ public: A(int aa) {} }; void f(A& a) { };…

    C++ 2023年5月29日
    050
  • VC++之自定义消息

    用户可以自定义消息,在应用程序中主动发出,这种消息一般用于应用程序的某一部分内部处理。 实例说明: 当用户按键盘上的光标上移键时,程序发送用户自定义消息,在对应的消息响应函数中弹出…

    C++ 2023年5月29日
    061
  • C++多线程库的常用函数 std::lock()

    格式:函数名 + 头文件 + 用例 + 解释说明 1 函数名: 2 std::lock() 3 4 头文件: 5 #include 6 7 用例: 8 std::mutex ma,…

    C++ 2023年5月29日
    057
  • C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区

    栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现…

    C++ 2023年5月29日
    068
  • c++的对象初始化

    忍不住了,不得不吐槽一下,妈的,太复杂了,真难,搞得太复杂了,看不懂,看不懂,真的越来越复杂了,没有必要啊! 看得了头皮发麻,搞不明白,咱又不是干编译器的,投降了。 工程代码中,代…

    C++ 2023年5月29日
    049
  • C++ 获取当前时间毫秒数

    在window环境下:1、精确到毫秒 include “stdafx.h” include include Original: https://www.cn…

    C++ 2023年5月29日
    052
  • 彻底搞懂之C++智能指针

    前言 在现代 c + + 编程中,标准库包含 智能指针,这些指针用于帮助确保程序不会出现内存和资源泄漏,并具有异常安全。 标准库智能指针分类 auto_ptr, shared_pt…

    C++ 2023年5月29日
    058
  • vs code配置c/c++开发环境

    一,下载TDM-GCC https://jmeubank.github.io/tdm-gcc/ 二,下载免安装版本的 VSCode-win32-x64-1.58.2 三,配置(参考…

    C++ 2023年5月29日
    053
  • c++ 条件变量

    http://blog.csdn.net/hemmanhui/article/details/4417433 互斥锁:用来上锁。 条件变量:用来等待,当条件变量用来自动阻塞一个线程…

    C++ 2023年5月29日
    042
  • 《Accelerated C++》学习笔记(1)——学习资料

    最近找到一本C++的书籍,英文名字《 Accelerated C++: Practical Programming by Example》,作者 Andrew Koenig, Ba…

    C++ 2023年5月29日
    063
  • C++中 线程函数为静态函数 及 类成员函数作为回调函数

    线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运行,静态函数的地址是不变的,并不在线程…

    C++ 2023年5月29日
    062
  • C++11 右值引用和转移语义

    新特性的目的 右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Se…

    C++ 2023年5月29日
    080
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球