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网页,但 ...
随机推荐
- MFC-ODBC API动态连接配置数据库
一.ODBC管理器介绍 在Window中,ODBC数据远管理器有6个标签:用户DSN.系统DSN.文件DSN.驱动程序.跟踪.连接池,通常情况下,使用用户DSN或者系统DSN,这里主要了解用户DSN和 ...
- Zabbix 配置笔记
Zabbix Server 安装参考 https://www.cnblogs.com/clsn/p/7885990.html 安装脚本 #!/bin/bash #clsn #设置解析 注意:网络条件较 ...
- win10安装和配置weblogic12c
下载和安装 http://www.oracle.com/technetwork/middleware/ias/downloads/wls-main-097127.html ● 将jar放到jdk的bi ...
- win10 wsl 运行后没有反应
wsl 运行一段时间后执行没有反应, 需要重启LxssManager 管理员模式打开 powshell 找到pid, 结束pid >tasklist /svc /fi "service ...
- dd命令创建文件
dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...
- Windows Docker Destop修改默认镜像文件位置
0.首先关闭docker destop. 1.通过Everything或者资源管理器找到以.vhdx结尾的文件所在的位置,这些就是docker镜像路径 2.我的路径:C:\Users\Administ ...
- 【Azure App Service for Linux】NodeJS镜像应用启动失败,遇见 RangeError: Incorrect locale information provided
问题描述 在App Service For Linux 中,部署NodeJS应用,应用启动失败. 报错信息为: 2023-08-29T11:21:36.329731566Z RangeError: I ...
- Beckhoff 倍福 漏洞-整理(持续更新)
工控漏洞整理网站 http://ivd.winicssec.com/index.php/Home/Search/search.html?keyword=Beckhoff
- CompletableFuture Demo
CompletableFuture Demo 题目:有一个数据库client,从数据库中取数据A和数据B,然后求和.请使用并发的知识,尽快的完成操作. /** * {@code @author:} k ...
- springl课程整理,图片文档
学习spring第一步,导入坐标 注入案例 还能给bean取一个或多个别名.格式如下name = "xxx,ooo" 工厂方法也能不用new 造方法 工厂类方法用下面方法 如果不用 ...