C#调用C++使用C++/CLI的实现

 更新时间:2024年03月27日 11:21:11   作者:咸鱼翻身?  
在C#开发过程中,我们可能会遇到需要调用Windows API 或是第三方库的场景,本文主要介绍了C#调用C++使用C++/CLI的实现,具有一定的参考价值,感兴趣的可以了解一下

简介

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 once
using 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

"$(ProjectDir)..\Debug\CPlusNative.dll" "$(TargetDir)"

到此这篇关于C#调用C++使用C++/CLI的实现的文章就介绍到这了,更多相关C#调用C++ 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#中利用Lotus notes公共邮箱发送邮件的方法

    C#中利用Lotus notes公共邮箱发送邮件的方法

    这篇文章主要给大家介绍了关于C#中利用Lotus notes公共邮箱发送邮件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定参考学习价值,需要的朋友们下面来一起看看吧。
    2018-02-02
  • C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    C# 委托的三种调用示例(同步调用 异步调用 异步回调)

    本文将主要通过同步调用、异步调用、异步回调三个示例来讲解在用委托执行同一个加法类的时候的的区别和利弊
    2013-12-12
  • C#使用FluentHttpClient实现请求WebApi

    C#使用FluentHttpClient实现请求WebApi

    FluentHttpClient 是一个REST API 异步调用 HTTP 客户端,调用过程非常便捷,下面我们就来学习一下C#如何使用FluentHttpClient实现请求WebApi吧
    2023-12-12
  • WinForm特效之桌面上的遮罩层实现方法

    WinForm特效之桌面上的遮罩层实现方法

    这篇文章主要介绍了WinForm特效之桌面上的遮罩层实现方法,是一个非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • C#委托现实示例分析

    C#委托现实示例分析

    这篇文章主要介绍了C#委托现实,实例分析了C#委托的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 使用C#将Excel转换为Markdown表格的实现方法

    使用C#将Excel转换为Markdown表格的实现方法

    在技术文档写作、开源项目维护以及数据报告生成等场景中,Markdown 表格凭借其轻量、易读且版本控制友好的特性,成为开发者首选的数据展示格式之一,然而,大量结构化数据往往存储在Excel文件中,索引本文将介绍如何使用C#将Excel转换为Markdown表格,需要的朋友可以参考下
    2026-05-05
  • C#数据库操作类AccessHelper实例

    C#数据库操作类AccessHelper实例

    这篇文章主要介绍了C#数据库操作类AccessHelper实例,可实现针对access数据库的各种常见操作,非常具有实用价值,需要的朋友可以参考下
    2014-10-10
  • C#实现Socket数据接收的三种经典方式

    C#实现Socket数据接收的三种经典方式

    本文将深入探讨 C# 中实现 Socket 数据接收的三种经典方式,结合真实案例分析常见问题,并提供优化后的完整代码示例,希望对大家有一定的帮助
    2025-08-08
  • C#实现两个DocumentDB实例之间同步数据的解决方案

    C#实现两个DocumentDB实例之间同步数据的解决方案

    这篇文章主要为大家详细介绍了C#实现两个DocumentDB实例之间同步数据的解决方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-02-02
  • C#使用SemaphoreSlim实现并发控制与限流策略的实战指南

    C#使用SemaphoreSlim实现并发控制与限流策略的实战指南

    在现代应用中(如爬虫、并发请求、数据库连接池、异步任务处理),我们常常需要限制同时执行的任务数量,以避免过载或资源竞争,在 C# 中,最简洁高效的解决方案之一就是SemaphoreSlim,本文就给大家介绍了C#使用SemaphoreSlim实现并发控制与限流策略的实战指南
    2025-11-11

最新评论