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

copy "$(ProjectDir)..\Debug\CPlusNative.dll" "$(TargetDir)"
C#调用C++ (使用C++/CLI)的更多相关文章
- Atitit 图像处理之编程之类库调用的接口api cli gui ws rest attilax大总结.docx
Atitit 图像处理之编程之类库调用的接口api cli gui ws rest attilax大总结.docx 1. 为什么需要接口调用??1 1.1. 为了方便集成复用模块类库1 1.2. 嫁 ...
- ***CI的CLI运行方式
linux下的执行命令: 1.PHP解释器 2.CI根目录的index.php 3.控制器所在的文件夹 4. 控制器名称 5. 方法名称 (参数) 参考文献: http://codeigni ...
- linux源码分析(五)-start_kernel
前置:这里使用的linux版本是4.8,x86体系. local_irq_disable(); 这个函数是做了关闭中断操作.和后面的local_irq_enable相对应.说明启动的下面函数是不允许被 ...
- docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储
前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...
- WCF消息拦截,利用消息拦截做身份验证服务
本文参考 http://blog.csdn.net/tcjiaan/article/details/8274493 博客而写 添加对信息处理的类 /// <summary> /// 消 ...
- db2 进程
DB2 通用数据库进程全接触 Dwaine Snow, DB2 UDB 和 Informix IDS 产品经理, IBM 多伦多实验室 Dwaine Snow 是 DB2 UDB 分区数据库以及查询巡 ...
- .net 高效管理稀缺资源(数据库资源,文件资源等)
MSDN建议按照下面的模式实现IDisposable接口: public class Foo: IDisposable { public void Dispose() { Dispose(true); ...
- JAVA(2)——JDBC
刚接触JDBC的时候,有时候就在想,为什么java要用JDBC,而不是直接使用之前在VB中就学习过的ODBC,由于ODBC是在JDBC之前出现,所以ODBC肯定由于无法完毕某些操作或者不能非常顺利的完 ...
- IDisposable接口详解
转载:http://www.cnblogs.com/davyli/archive/2010/09/13/1825042.html 正确实现 IDisposable .NET中用于释放对象资源的接口是I ...
- PHP结合Linux的cron命令实现定时任务
PHP死循环 来处理定时任务的效率是很低的.(众多网友评价)大家都建议使用Linux内置的定时任务crontab命令来调用php脚本来实现. PHP定时任务的两种方法:1.web方式调用php网页,但 ...
随机推荐
- JS leetcode 最大连续1的个数 题解分析
壹 ❀ 引 今天来做一道十分烦躁的题目,为什么烦躁,因为我字母写错了提交了三次错了三次!!!我的leetcode正确率大大下降!!那么这道题是leetcode的485. 最大连续1的个数,题目描述如下 ...
- Dubbo本地调试方法
方法一:用版本号来区分 比如,开发环境上跑的服务版本是1.0.0,那么为了在本地打断点调试某个服务,可以在本地启动,将version设置为2.0.0 服务提供者 @DubboService(versi ...
- Perl Script to convert binary to hex
Usage ./bin2hex 166_TurnItUpPhrVox_01_627a.mp3 1 /* begin binary data: */ char bin_data[] = /* 35065 ...
- vscode添加自定义html片段
最近在学vue,用的是微软的vscode 开发工具. 很不错,赞一下微软.里面包含了众多插件大家可以各取所需. 另外有一项实用的功能,User Snippets 用户自定义代码段, 对于那些需要重复编 ...
- 网站(>???<)
http://cpeditor.org/ https://csacademy.com/app/graph_editor/ https://www.cnblogs.com/zhangyi1357/p/1 ...
- SpringCloud SpringBoot 组件使用:使用Nacos作为服务的注册中心和配置中心
基础篇 一.什么是Nacos? 官方介绍是这样的: Nacos 致力于帮助您发现.配置和管理微服务.Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现.服务配置管理.服务及流量管理. Na ...
- 硬件开发笔记(十五):RK3568底板电路VGA显示接口原理图分析
前言 前面输出了HDMI,LVDS,MIPI-DSI,这里还有一个常用的显示接口就是VGA了,这个用的不多了,一般板子都是hdmi了. 本篇分析底板VGA电路. VGA接口 VGA(Vi ...
- 利用wiile双层循环打印各种星星---day06
# 十行十列小星星 j = 0 #定义行数 while j<10: #当行数小于10的时候 i=0 #定义列 while i <10: #当列小于10的时候 print('*',end=' ...
- React 组件懒加载
只有不断学习和成长,才能适应这个快速变化的世界. 1. 懒加载 1.1 React 懒加载 React 中懒加载 Lazy 与 Suspense 需要搭配使用. React.lazy 定义: Reac ...
- 有了 ETL 数据神器 dbt,表数据秒变 NebulaGraph 中的图数据
本文搭配同主题分享视频阅读更佳,<多数据源的数据治理实践> 如果你装好某款数据库产品,比如:分布式图数据库 NebulaGrpah,跃跃欲试的第一步是不是就让它干活搞数据呢?好的,现在问题 ...