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

输出结果

相关推荐
她说彩礼65万11 分钟前
C# params使用
开发语言·c#·log4j
历程里程碑19 分钟前
C++ 10 模板进阶:参数特化与分离编译解析
c语言·开发语言·数据结构·c++·算法
老秦包你会26 分钟前
C++进阶------智能指针和特殊类设计方式
开发语言·c++
专注VB编程开发20年29 分钟前
C#内存加载dll和EXE是不是差不多,主要是EXE有入口点
数据库·windows·microsoft·c#
code bean1 小时前
【CMake 】[第十篇]CMake find_package 完全指南:让第三方库集成变得简单
c++·cmake
IT19951 小时前
C++使用“长度前缀法”解决TCP“粘包 / 拆包”问题
服务器·网络·c++·tcp/ip
Tipriest_1 小时前
旋转矩阵,齐次变换矩阵,欧拉角,四元数等相互转换的常用代码C++ Python
c++·python·矩阵
她说彩礼65万2 小时前
C# 反射
java·算法·c#
hz_zhangrl2 小时前
CCF-GESP 等级考试 2025年9月认证C++六级真题解析
c++·算法·青少年编程·程序设计·gesp·2025年9月gesp·gesp c++六级
兵哥工控2 小时前
MFC用高精度计时器实现五段时序控制器
c++·mfc·高精度计时器·时序控制器