C++ 与 C#混合编程 示例 (基于VS2022)
C#使用过程中经常会遇到和C++联合开发的过程,通过C++编写动态库,封装成dll后再C#中调用,在此做个记录,
一、新建C#控制台项目
打开VisualStudio,新建一个C#控制台项目,

项目名称HelloWorldTest

下一步

点击下一步,一个默认c#项目创建完成
二、创建C++库
在解决方案上右键--添加--新建项目,建一个C++动态链接库工程,

输入项目名称HelloDll,然后下一步

创建完成后如下,在 项目--右键--添加--类, 添加 TestDll 头文件 和源文件 ,文件内容如下:

然后在 TestDll.cpp 文件 添加代码,如下
#include "pch.h"
#include "TestDll.h"
#include<iostream> void HelloWorld(char* name)
{
std::cout << "Hello World " << name << std::endl;
} int Test()
{
return 666666;
} int Add(int a, int b)
{
return a + b;
}
C++库导出有两种方式,建议两种方式同时使用
1、以C语言接口的方式导出
在函数前面加上 extern "C" __declspec(dllexport)
extern "C" __declspec(dllexport) void HelloWorld(char* name);
extern "C" __declspec(dllexport) int Test();
extern "C" __declspec(dllexport) int Add(int a,int b);
或者使用 extern "C" 包装 类文件
#pragma once #ifdef __cplusplus
extern "C" {
#endif
class TestDll
{
__declspec(dllexport) void HelloWorld(char* name);
__declspec(dllexport) int Test();
__declspec(dllexport) int Add(int a, int b);
};
#ifdef __cplusplus
}
#endif
2、以模块定义文件的方式导出
在源文件上点击右键,选择添加-》新建项,然后选择 代码-》模块定义文件,添加TestDll.def 文件

在TestDll.def 中输入 代码如下:
LIBRARY "TestDll" EXPORTS //下边是要导出的函数 不需要分号隔开 HelloWorld @ 1
Test @ 2
Add @ 3
编译生成dll。这里需要注意的是,如果生成是64位的库,C#程序也要是64位的,否则会报错

三、C#项目HelloWorldTest下 添加代码
注意 导入命名空间using System.Runtime.InteropServices;
在DllImport导入C/C++编写的动态库时函数,可以加上一些约定参数,例如:
[DllImport(@"HelloDll.dll", EntryPoint = "Test", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
CallingConvention = CallingConvention.Cdecl,来指定入口点的调用约定
C/C++编写的动态库默认的入口点约定为_cdecl,VS 默认调用动态库时的约定为_winapi
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks; namespace HelloWorldTest
{
internal class Program
{
[DllImport("HelloDll.dll")]
public static extern void HelloWorld(string name);
[DllImport("HelloDll.dll")]
public static extern int Test();
[DllImport("HelloDll.dll")]
public static extern int Add(int a, int b); static void Main(string[] args)
{
Console.WriteLine(Test().ToString());
Console.WriteLine(Add(2, 5));
HelloWorld("大大大大大猩猩");
Console.ReadKey();
}
}
}
然后生成程序 ,注意生成格式要一致

把HelloDll.dll添加 HelloWorldTest 项目的引用中 或 把 HelloDll.dll文件放到HelloWorldTest.exe 所在目录

F5 启动程序

C++ 与 C#混合编程 示例 (基于VS2022)的更多相关文章
- Fortran与C/C++混合编程示例
以下例子均来自网络,只是稍作了编辑,方便今后查阅. 子目录 (一) Fortran调用C语言 (二) C语言调用Fortran (三) C++ 调用Fortran (四) Fortran 调用 C++ ...
- python 下 tinker、matplotlib 混合编程示例一个
该例是实现了 Tinker 嵌入 matplotlib 所绘制的蜡烛图(k 线),数据是从 csv 读入的.花一下午做的,还很粗糙,仅供参考.python 代码如下: import matplotli ...
- CUDA+OpenGL混合编程
CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...
- 基于引擎的matlab+vc混合编程的配置
前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...
- 由基于qml,c++的串口调试工具浅谈qml与c++混合编程
最近在做一个基于sim900 的串口通信工具,基于qml和c++来实现. 首先,对于串口,qt有自带的QSerialPort,可以实现同步,和异步通信,qt creator也有自带的例子,本例子是从其 ...
- Matlab与.NET基于类型安全的接口混合编程入门
原文:[原创]Matlab与.NET基于类型安全的接口混合编程入门 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ...
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库
前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...
- C#和MatLab的混合编程(充分利用二者的优势)
C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010:Ma ...
- Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结
前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...
随机推荐
- 1分钟了解 GPT-1到GPT-3 演化过程
在研发ChatMoney这款产品的时候,我开始深入研究GPT的诞生,逐记录下来分享给大家. 前言 Generative Pre-trained Transformer(GPT)系列是由OpenAI开发 ...
- Spring的DI依赖注入
xml中依赖注入bean bean标签下 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE b ...
- MySQL 字符集、排序规则与查询关系详解
MySQL 查询是否区分大小写及重音敏感,取决于创建时指定的字符集(character set)和排序规则(collation). (1)字符集(Character Set):规定可存储的字符,如 u ...
- Golang基础笔记六之流程控制
本文首发于公众号:Hunter后端 原文链接:Golang基础笔记六之流程控制 本篇笔记介绍 Golang 里流程控制相关的一些语法,以下是本篇笔记目录: 条件语句 循环语句 1.条件语句 1. if ...
- 分时间段(年份或月份)统计,没有数字补0 Java(替代 MYSQL) 做法
需求如下~ 输入年份,表格第一行 1-12 月 输入年份和月份 表格第一行 1--31 具体天数 表格第二行就是统计数量,没有补0. 看完首先想到MYSQL查询出连续一段时间和数量,没有 就为0. ...
- 在 SQL Server 中 你可以使用以下查询来找到引用 的 FOREIGN KEY 约束
SELECT f.name AS ForeignKeyName, OBJECT_NAME(f.parent_object_id) AS ReferencingTable, COL_NAME(fc.pa ...
- css3桃花随意飘落
桃花随意飘落 css3 + js 不实用第三方类库 效果图 <!DOCTYPE html> <html lang="en"> <head> &l ...
- 03数字ic综合文件内部对象
数字IC综合中的内部对象深度解析 目录 1. 概述 ️ 2. 设计对象体系结构 3. 核心对象详解 4. 对象获取与操作 5. 高级对象操作技巧 6. 实战应用案例 7. 最佳实践与注意事项 1. 概 ...
- raspberry 搭建ftp服务器
起先是因为每次scp是真的烦不仅仅每次要输入密码之类乱七八遭的东西,烦人 raspberry 安装vsftpd sudo nano /etc/vsftpd.conf 我把里面的022 umask 修改 ...
- qt 中 使用 opengl 上下文 (context) 相关的注意事项
qt 中 使用 opengl 相关的注意事项 本人移植了一个glut到qt的项目,前期没有注意相关的上下文的使用,导致相关的显示混乱. 解决方案 makeCurrent();在每一个类函数中加上这一句 ...