C#调用C++ DLL方法之C++/CLI(托管C++)

托管C++与C++/CLI前世今生

C++/CLI (C++/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展,它是为了与 .NET Framework 进行互操作而设计的。C++/CLI 是 C++ 的一种方言,它引入了一些新的语法和关键字,以便更好地支持 .NET 类型和垃圾回收。

托管C++ (Managed Extensions for C++) 是早期的一种用于编写托管代码的语言扩展,它也是为了与 .NET Framework 进行互操作而设计的。托管C++ 是 C++ 的一种扩展,但它的语法和使用方式相对复杂和不直观。

以下是 C++/CLI 和托管C++ 的一些主要区别:

  1. 语法和关键字:

    C++/CLI 引入了新的语法和关键字,如 ref class^ (句柄) 和 gcnew

    使得编写托管代码更加直观和简洁。

    托管C++ 使用 __gc__value 等前缀来标识托管类型,语法相对复杂。

  2. 类型系统:

    C++/CLI 更好地集成了 .NET 类型系统,支持泛型、委托和事件等特性。

    托管C++ 对 .NET 类型系统的支持较为有限,使用起来不如 C++/CLI 方便。

  3. 性能和优化:

    C++/CLI 在性能和优化方面进行了改进,生成的代码更高效。

    托管C++ 的性能相对较差,生成的代码效率不如 C++/CLI。

  4. 兼容性和支持:

    C++/CLI 是当前主流的用于编写托管代码的 C++ 扩展,得到了更好的支持和维护。

    托管C++ 已经被弃用,不再推荐使用。

参考文献
Managed Extensions for C++
C++/CLI

代码示例

C++部分

复制代码
//.h
#ifndef HEADER_H
#define HEADER_H

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

#ifdef MYCLASS_EXPORTS
#define MYCLASS_EXPORTS __declspec(dllexport)
#else
#define MYCLASS_EXPORTS __declspec(dllimport)
#endif

extern "C" MYCLASS_EXPORTS int Add(int numberA, int numberB);

class MyClass
{

public:
    MyClass();
    ~MyClass();

};

#endif // !HEADER_H


//c.pp
#include "header.h"

MyClass::MyClass()
{
}

MyClass::~MyClass()
{
}

MYCLASS_EXPORTS int Add(int numberA, int numberB)
{
	// 计算两个数的和
	int result = numberA + numberB;
	// 返回结果
	return result;
}

1.设置预处理器

2.输出dll

CLR部分

复制代码
//.h
#ifndef HEADER_H
#define HEADER_H

#include <iostream>
#include "../MyDll/header.h"//引用库声明对应文件路径

public ref class MyClrClass
{
public:
    MyClrClass();
	int AddCode(int numberA, int numberB);
};

#endif // !HEADER_H


//.cpp
#include "header.h"

MyClrClass::MyClrClass()
{
}

int MyClrClass::AddCode(int numberA, int numberB)
{
    return Add(numberA, numberB);
}

1.修改公共语言运行时支持

2.设置语言符合模式

3.引用前面c++部分

4.输出目标dll

C#调用部分

复制代码
var a = 10;
var b = 20;
var invoke = new MyClrClass();
var addResult = invoke.AddCode(a, b);
Console.WriteLine($"Add result is {addResult}");

添加CLR dll

输出结果

相关推荐
FL16238631297 小时前
C++基于opencv实现的暗通道的先验图像去雾
c++·opencv·计算机视觉
仰泳的熊猫8 小时前
LeetCode:538. 把二叉搜索树转换为累加树/1038. 从二叉搜索树到更大和树
数据结构·c++·算法·leetcode
kyle~8 小时前
C++---向上取整
开发语言·c++
小龙报8 小时前
《算法通关指南---C++编程篇(1)》
开发语言·c++·程序人生·算法·学习方法·visual studio
Cx330❀8 小时前
《C++ 手搓list容器底层》:从结构原理深度解析到功能实现(附源码版)
开发语言·数据结构·c++·经验分享·算法·list
仰泳的熊猫9 小时前
LeetCode:98. 验证二叉搜索树
数据结构·c++·算法·leetcode
暴力求解9 小时前
C++ --- 模版初阶
c++
CC.GG9 小时前
【C++】STL容器--list的使用
开发语言·c++·list
武文斌779 小时前
项目学习总结:CAN总线、摄像头、STM32概述
linux·arm开发·stm32·单片机·嵌入式硬件·学习·c#
草莓熊Lotso9 小时前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法