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)的更多相关文章

  1. Fortran与C/C++混合编程示例

    以下例子均来自网络,只是稍作了编辑,方便今后查阅. 子目录 (一) Fortran调用C语言 (二) C语言调用Fortran (三) C++ 调用Fortran (四) Fortran 调用 C++ ...

  2. python 下 tinker、matplotlib 混合编程示例一个

    该例是实现了 Tinker 嵌入 matplotlib 所绘制的蜡烛图(k 线),数据是从 csv 读入的.花一下午做的,还很粗糙,仅供参考.python 代码如下: import matplotli ...

  3. CUDA+OpenGL混合编程

    CUDA+OpenGL混合编程示例: #include <stdio.h> #include <stdlib.h> #include "GL\glew.h" ...

  4. 基于引擎的matlab+vc混合编程的配置

    前段时间在项目中做了一些关于基于引擎的vc+matlab混合编程的工作. 如果你是混合编程新手,我相信使用引擎的方式编程是比较简单快捷的一种方式. 当然这种方法也有其缺点,就是不能脱离matlab运行 ...

  5. 由基于qml,c++的串口调试工具浅谈qml与c++混合编程

    最近在做一个基于sim900 的串口通信工具,基于qml和c++来实现. 首先,对于串口,qt有自带的QSerialPort,可以实现同步,和异步通信,qt creator也有自带的例子,本例子是从其 ...

  6. Matlab与.NET基于类型安全的接口混合编程入门

    原文:[原创]Matlab与.NET基于类型安全的接口混合编程入门 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ...

  7. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  8. [转载:]C#与Fortran混合编程之本地调用Fortran动态链接库

    前言 C#发展到现在,已是一门相当完善的语言,他基于C语言风格,演化于C++.并依靠强大的.NET底层框架.C#可以用来快速构建桌面及Web应用.然而在我们的实际工作中,尽管C#已经非常完善,但还是不 ...

  9. C#和MatLab的混合编程(充分利用二者的优势)

    C#和MatLab的混合编程,充分利用了winform的直观显示和matlab的强大计算能力.在此以一个小例子的形式给大家讲述一下二者混合编程的实现. 一.软件的配置说明 C#版本:VS2010:Ma ...

  10. Android程序中,内嵌ELF可执行文件-- Android开发C语言混合编程总结

    前言 都知道的,Android基于Linux系统,然后覆盖了一层由Java虚拟机为核心的壳系统.跟一般常见的Linux+Java系统不同的,是其中有对硬件驱动进行支持,以避开GPL开源协议限制的HAL ...

随机推荐

  1. 扎“芯”了——CP探针卡的国产替代道阻且长

    这是IC男奋斗史的第19篇原创 关注公众号[IC男奋斗史],让我们一起撸起袖子加油干! 本文3810字,预计阅读10分钟. 之前在<凤姐如何变冰冰?>这篇文章中杰哥有介绍过CP测试,也提到 ...

  2. k8s一、基本概念

    目录 Kubernetes的设计架构 Master Node 组件简的基本交互流程 Kubernetes的核心对象 Pod 控制器 Replication Controller 和 ReplicaSe ...

  3. 使用 Firefox (火狐)浏览器 必开的配置

    首先,在网址输入框中输入 about:config 进入浏览器配置页面 设置打开书签的时候在新标签页打开 然后搜索 browser.tabs.loadBookmarksInTabs 并将它的值改为tr ...

  4. vue_过渡&动画、过滤器、指令

    过度和动画 <html lang="en"> <head> <meta charset="UTF-8"> <title ...

  5. java基础(变量与数据类型)

    数据类型 计算机内存分为 : 1.寄存器(java不能直接控制) 2.栈 存储位置:先进后出,存取数据效率高,仅次于寄存器,存储空间小,不能存大量数据,存放基本类型数据 3.堆 效率低,位置随机分配, ...

  6. macOS Monterey系统安装 CocoaPods详细教程

    更新ruby 系统默认的应该是老旧的 v2.6.10,我们要更新到3.x以上,不然可能会和其它较新插件(如3.x的gem)冲突. 安装rbenv brew install rbenv # 对于 mac ...

  7. Ubuntu使用Certbot生成泛域名解析证书

    1. 安装Certbot sudo apt install certbot -y certbot --version certbot 2.9.0 2. 域名验证 泛域名的验证采用DNS01的验证方式, ...

  8. lingo 练习3

    简介 练习 question 有一个护士工作站点,每天(周一至周日)所需最少职员数量20,16,13,16,19,14,和12,并要求每个职员一周连续工作5天,试求每周所需最少职员数,并给出安排. c ...

  9. 低代码开发平台,可零代码发布API

    RestCloud低代码开发平台可以快速的开发企业级前后端分离的业务系统以及基于微服务架构的业务系统.平台通过建立数据模型和业务模型能够无代码快速的发布API服务,同时也能基于数据模型快速生成Java ...

  10. 一种基于openmv和触摸屏的动态读取颜色的解决方案

    一种基于openmv和触摸屏的动态读取颜色的解决方案 前言: ​ 作为大学生电子设计竞赛控制题选手,常常需要与视觉上位机打交道,openmv作为当前一种开源方案,能够以较低的成本制作,并且官方文档和各 ...