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

输出结果

相关推荐
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
雨落倾城夏未凉5 天前
第四章c#方法-参数数组和可选参数(16)
后端·c#
卷无止境5 天前
C++ 的Eigen 库全解析
c++
卷无止境5 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴5 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
唐青枫6 天前
线程不是越多越快:C#.NET Thread 生命周期、同步与后台工作线程实战
c#·.net