写点什么

C#调用 C++ (使用 C++/CLI)

作者:EquatorCoco
  • 2024-03-26
    福建
  • 本文字数:1430 字

    阅读完需:约 5 分钟

简介


C++/CLI(C++ Common Language Infrastructure)是一种允许在 .NET 平台上创建托管代码(managed code)和非托管代码(unmanaged code)之间互操作的语言。其原理可以概括如下:


  • 编译器支持: C++/CLI 编译器能够编译同时包含托管和非托管代码的源文件。这使得在同一个项目中可以混合使用 C++ 和 C# 或其他 .NET 语言。

  • 托管和非托管代码的桥梁: C++/CLI 提供了语法和关键字,允许你在同一个文件中编写托管代码和非托管代码。这些代码可以相互调用,使得 C# 和 C++ 之间的交互变得简单。

  • CLR(Common Language Runtime)集成: C++/CLI 代码在编译时会生成对 CLR 的调用,因此它可以利用 CLR 提供的各种功能,例如垃圾回收、类型安全性和异常处理等。

  • 托管代码的封装: 在 C++/CLI 中,你可以将非托管的 C++ 代码封装在托管的类中,通过公共接口暴露给其他 .NET 语言。这样,C++ 的功能可以被其他 .NET 语言轻松调用和使用。

  • 数据类型转换: C++/CLI 提供了一组转换操作符和工具,用于在托管代码和非托管代码之间进行数据类型的转换。这样,你可以在 C++/CLI 中轻松处理 C# 中的数据类型,反之亦然。

  • 资源管理: 在 C++/CLI 中,你可以使用托管的资源管理功能(如 gcnew 创建托管对象和 delete 销毁对象),同时也可以手动管理非托管资源(如使用析构函数释放内存)。


新建解决方案->CSharpCPlusSolution



新建动态链接库(DLL)->CPlusNative



新建类 NativeCalculate


//NativeCalculate.h
#pragma once#ifndef NATIVE_CLASS_H#define NATIVE_CLASS_H
class __declspec(dllexport) NativeCalculate {public:static int Add(int a, int b);};
#endif // NATIVE_CLASS_H
复制代码


//NativeCalculate.cpp
#include "pch.h"#include "NativeCalculate.h"
int NativeCalculate::Add(int a, int b) { return a + b;}
复制代码


Build CPlusNative 项目确保能成功生成 CPlusNative.dll 和 CPlusNative.lib 文件


新建 CLI 类库(DLL)->CPlusWrapper



添加包含目录 NativeCalculate.h



添加 CPlusNative.lib 附加库目录



添加附加库依赖项 CPlusNative.lib



创建包装类 NativeCPlusWrapper


上述配置完毕后,CPlusWrapper 项目创建包装类 NativeCPlusWrapper


//NativeCPlusWrapper.h
#pragma onceusing namespace System;namespace CPlusWrapper { public ref class NativeCPlusWrapper { public: static int Add(int a, int b); };}
复制代码


//CPlusWrapper.cpp
#include "pch.h"#include "NativeCPlusWrapper.h"#include "NativeCalculate.h"
using namespace CPlusWrapper;
int NativeCPlusWrapper::Add(int a, int b) { int sum = 0; sum = NativeCalculate::Add(a, b); return sum;}
复制代码


Build CPlusWrapper 项目确保能成功生成 CPlusWrapper.dll 文件


新建 C# 控制台项目 CSharpConsoleApp

添加 CPlusWrapper.dll 引用



CSharpConsoleApp 项目调用 NativeCPlusWrapper 方法

namespace CSharpConsoleApp{    class Program    {        static void Main(string[] args)        {            int sum = CPlusWrapper.NativeCPlusWrapper.Add(33, 66);        }    }}
复制代码


常见错误



程序运行目录找不到 CPlusNative.dll 所以报错



拷贝 CPlusNative.dll 到 Debug 目录下即可

或者使用 Pre-build event command line



copy "$(ProjectDir)..\Debug\CPlusNative.dll" "$(TargetDir)"
复制代码


文章转载自:咸鱼翻身?

原文链接:https://www.cnblogs.com/mchao/p/18094607

体验地址:http://www.jnpfsoft.com/?from=001


用户头像

EquatorCoco

关注

还未添加个人签名 2023-06-19 加入

还未添加个人简介

评论

发布
暂无评论
C#调用C++ (使用C++/CLI)_c++_EquatorCoco_InfoQ写作社区