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

输出结果

相关推荐
htj104 分钟前
C# 使用正则表达式
正则表达式·c#
~plus~4 分钟前
WPF八大法则:告别模态窗口卡顿
开发语言·经验分享·后端·程序人生·c#
就是有点傻13 分钟前
使用WPF的Microsoft.Xaml.Behaviors.Wpf中通用 UI 元素事件
c#
qq_297908011 小时前
C#报价系统陈列展示成本核算系统项目管理系统纸品非纸品报价软件
sqlserver·c#·.net·开源软件
Dovis(誓平步青云)1 小时前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
KyollBM2 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
feiyangqingyun2 小时前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
CV点灯大师2 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
成工小白3 小时前
【C++ 】智能指针:内存管理的 “自动导航仪”
开发语言·c++·智能指针
sc写算法3 小时前
基于nlohmann/json 实现 从C++对象转换成JSON数据格式
开发语言·c++·json