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++ 的一些主要区别:
-
语法和关键字:
C++/CLI 引入了新的语法和关键字,如ref class
、^
(句柄) 和gcnew
,
使得编写托管代码更加直观和简洁。
托管C++ 使用__gc
、__value
等前缀来标识托管类型,语法相对复杂。 -
类型系统:
C++/CLI 更好地集成了 .NET 类型系统,支持泛型、委托和事件等特性。
托管C++ 对 .NET 类型系统的支持较为有限,使用起来不如 C++/CLI 方便。 -
性能和优化:
C++/CLI 在性能和优化方面进行了改进,生成的代码更高效。
托管C++ 的性能相对较差,生成的代码效率不如 C++/CLI。 -
兼容性和支持:
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
输出结果