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

输出结果

相关推荐
CoderIsArt3 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
「QT(C++)开发工程师」6 小时前
C++ auto 用法详解
开发语言·c++
OPEN-F6 小时前
C++STL教程:容器适配器与实用工具
开发语言·c++
OPEN-F7 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
有点。7 小时前
C++二叉搜索树进阶
开发语言·c++
HugoStudio_SWAN7 小时前
【擦除重绘】C++ 控制台动画:弹跳 Logo DVD 屏保效果
开发语言·c++·学习·程序人生
kyle~8 小时前
C++_STL---迭代器失效
开发语言·c++
wuminyu10 小时前
深入剖析 Panama Off-heap 的性能损耗与开销
java·linux·c语言·jvm·c++
rhythm-ring10 小时前
宏定义续行符 \ 的使用与踩坑
c语言·c++
江安下小雨11 小时前
muduo网络库(十六):新增连接池模块
网络·c++