Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用

背景

开发中我们基本使用windows系统比较快捷,但是部署的时候我们又希望使用linux比较便宜,硬件产商还仅提供了c++ sdk!苦了我们做二次开发的码农。

方案

需要确认一件事,目前c++这门语言不是跨平台的

第一个问题【C++生成dll在windows下使用C#调用】解决方案:

1、使用vs2022创建一个c++ window空项目,命名为DllForWindows

 

2、右键单击项目名称,选择属性,并在属性中修改输出类型为动态链接库dll

3、为我们的源文件目录添加一个main.cpp,内容如下:

extern "C" {
	__declspec(dllexport) int add(int x, int y) { return x + y; }
	__declspec(dllexport) int sub(int x, int y) { return x - y; }
	__declspec(dllexport) int mul(int x, int y) { return x * y; }
	__declspec(dllexport) int div(int x, int y) { return x / y; }
}

 

4、重新生成解决方案,就可以在Debug目录下找到我们的dll了

 

 5、新建一个C# DotNet6 控制台空项目,命名为TestDllForWindows

 

 

6、把Program.cs代码修改为如下,然后重新生成一下解决方案,我们会生成bin目录

using System.Runtime.InteropServices;

namespace TestDllForWindows
{
    internal class Program
    {
        [DllImport("DllForWindows.dll")]
        static extern int add(int x, int y);
        [DllImport("DllForWindows.dll")]
        static extern int sub(int x, int y);
        [DllImport("DllForWindows.dll")]
        static extern int mul(int x, int y);
        [DllImport("DllForWindows.dll")]
        static extern int div(int x, int y);

        static void Main(string[] args)
        {
            int x = 10, y = 5;
            Console.WriteLine(add(x, y));
            Console.WriteLine(sub(x, y));
            Console.WriteLine(mul(x, y));
            Console.WriteLine(div(x, y));
        }
    }
}

7、拷贝一份我们C++生成的dll到 bin/Debug/net6.0目录

8、运行我们的程序,可以看到结果如我们所料

 

 

第二个问题【C++生成so在linux下使用C#调用】解决方案:

1、 使用vs2022创建一个c++ linux空项目,命名为SoForLinux

 

2、 新建main.cpp,内容如下【与生成windows动态链接库不同,这里不需要__declspec(dllexport)修饰】

3、右键单击项目名称,进入属性页,修改生成so文件

 

4、重新生成解决方案,可以在Debug文件夹下看到生成了lib前缀的so文件

5、新建一个C# DotNet6 控制台项目,名称为TestSoForLinux

6、把Program.cs文件内容修改为如下

using System.Runtime.InteropServices;

namespace TestDllForWindows
{
    internal class Program
    {
        [DllImport("libSoForLinux.so")]
        static extern int add(int x, int y);
        [DllImport("libSoForLinux.so")]
        static extern int sub(int x, int y);
        [DllImport("libSoForLinux.so")]
        static extern int mul(int x, int y);
        [DllImport("libSoForLinux.so")]
        static extern int div(int x, int y);

        static void Main(string[] args)
        {
            int x = 10, y = 5;
            Console.WriteLine(add(x, y));
            Console.WriteLine(sub(x, y));
            Console.WriteLine(mul(x, y));
            Console.WriteLine(div(x, y));
        }
    }
}

7、右键单击项目名称,选择【发布】

 

 

8、点击小铅笔,部署模式改为【独立:这样linux系统不需要安装dotnet运行环境,我们打包的时候就带了进去,占用磁盘会稍大一点但是省心】,目标运行时为linux-x64【我的ubuntu x64的运行环境就是这个,大家根据实际视情况而定】,发布选项里勾选生成单个文件【相当于vs尽可能帮我们把应用和依赖包搞成一个文件】

 

9、保存发布配置,并点击发布,发布完毕后,我们点击打开文件夹

 

10、把生成的文件TestSoForLinux和C++生成的libSoForLinux.so都拷到我们的linux系统同一文件夹下

11、使用终端打开此目录,输入如下命令后回车【注意有个英文小数点,linux下好像需要指定目录位置】

./TestSoForLinux 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/357571.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言——深入理解指针1

目录 1. 内存和地址1.1 内存 2. 指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符(*)2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针 4. const…

TypeScript 学习笔记(Day2)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. TypeScript 学习笔记(Day1) 目录 3 TypeScript 常…

百度输入法往选字框里强塞广告

关注卢松松,会经常给你分享一些我的经验和观点。 国内几乎100%的输入法都有广告,只是你们没发现而已!!! 百度输入法居然在输入法键盘上推送广告,近日,博主阑夕 表示,V2EX论坛上有…

【webrtc】‘ninja.exe‘ 不是内部或外部命令,也不是可运行的程序及vs2019 重新构建m98

werbtc 就是用ninja.exe 来构建找到了自己以前构建的webrtc 原版 m98 【m98 】webrtc ninja 构建 、example、tests 及OWT- P2P 项目P2PMFC-E2E-m98G:\CDN\rtcCli\webrtc-checkout\src找到了自己的deptools的路径 deptools里确实没有ninja.exe D:\SOFT\depot_tools\third_party…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…

基于数字签名技术的挑战/响应式认证方式

挑战/响应式认证方式简便灵活&#xff0c;实现起来也比较容易。当网络需要验证用户身份时&#xff0c;客户端向服务器提出登录请求&#xff1b;当服务器接收到客户端的验证请求时&#xff0c;服务器端向客户端发送一个随机数&#xff0c;这就是这种认证方式的“冲击&#xff08…

ArcGIS Pro如何新建字段

无论是地图制作还是数据分析&#xff0c;字段的操作是必不可少的&#xff0c;在某些时候现有的字段不能满足需求还需要新建字段&#xff0c;这里为大家讲解一下在ArcGIS Pro中怎么新建字段&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的水…

响应式商业服务专利版权申请 公司网站模板源码系统 带完整的搭建教程

随着互联网的普及和发展&#xff0c;企业对于建立专业、高效的网站的需求日益增长。为了满足这一市场需求&#xff0c;罗峰给大家分享一款响应式商业服务专利版权申请公司网站模板源码系统。该系统不仅功能强大&#xff0c;而且易于搭建和定制&#xff0c;极大地降低了企业建立…

单片机学习笔记---定时器计数器(含寄存器)工作原理介绍(详解篇2)

目录 T1工作在方式2时 T0工作在方式3时 四种工作方式的总结 定时计数器对输入信号的要求 定时计数器对的编程的一个要求 关于初值计算的问题 4种工作方式的最大定时时间的大小 关于编程方式的问题 实例分析 实例1 实例2 T1工作在方式2时 51单片机&#xff0c;有两个…

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…

C语言递归篇章+系统讲解分析+深入理解递归+根源进行讲解+进制转换+操作环境+实例剖析+万字+百张图片精细化讲解

递归的讲解系统分析 什么是递归 本质上就是一种算法 最简单递归 栈溢出 没有限制条件 导致无穷尽的调用自己 从而溢出 最后变成死递归 _________________________________________________________________________________________________________________________________…

SAP MM 采购发票输入税额,模拟时候发现没有税科目记账税额!

原因&#xff1a;行项目税额和抬头不一样导致&#xff0c;以下是调整过的截图&#xff0c;原来底下是J2

去中心化世界的奇迹:深度解析Web3

随着科技的飞速发展&#xff0c;我们正逐渐进入一个新的数字时代&#xff0c;而Web3技术正是这个时代的奇迹之一。本文将深入解析Web3&#xff0c;揭示它在构建去中心化世界方面的深远影响以及给我们带来的可能性。 什么是Web3&#xff1f; Web3是互联网的第三个时代&#xff…

低代码数字孪生平台

老子云平台 老子云平台专注于3D资源服务与应用在Web页面上的极致展示&#xff08;渲染与交互&#xff09; 老子云平台架构 核心优势-AMRT标准格式 2022年6月&#xff0c;在国家科技部科技成果鉴定中心的成果评定中&#xff0c;AMRT标准被评为国际先进成果&#xff0c;AMRT格式…

TCP常用端口号

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE\…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

shell脚本——函数与数组

目录 一、函数 1、什么是函数&#xff1f; 2、函数的定义与调用 2.1 函数的格式 2.2 函数的调用方法 3 、查看与删除函数 3.1 查看函数 3.2 删除函数 4、函数的返回值 5、函数的传参数 6、函数的作用范围 7、函数的递归 二、数组 1、什么是数组&#xff1f; 2、数…

【数据结构】(一)从绪论到各种线性表

目录 一、绪论Introduction 1、数据结构 2、逻辑结构&#xff08;数据元素之间的相互关系&#xff09; 3、物理结构&#xff08;数据逻辑结构在计算机中的存储形式&#xff09; 4、数据类型&#xff08;一组性质相同的值的集合及定义在此集合上的一些操作的总称&#xff09…

mysql之基本查询

基本查询 一、SELECT 查询语句 一、SELECT 查询语句 查询所有列 1 SELECT *FORM emp;查询指定字段 SELECT empno,ename,job FROM emp;给字段取别名 SELECT empno 员工编号 FROM emp; SELECT empno 员工编号,ename 姓名,job 岗位 FROM emp; SELECT empno AS 员工编号,ename …