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 

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】—— 信号的产生

本期,我们今天要将的是信号的第二个知识,即信号的产生。 目录 (一)通过终端按键产生信号 (二)调用系统函数向进程发信号 (三)由软件条件产生信号 (四)硬件…

【MySQL】学习如何通过DQL进行数据库数据的基本查询

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KvH5jXnPNsRtMkOC {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

【EI会议征稿通知】2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024)

2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024) 2024 4th International Conference on Laser, Optics and Optoelectronic Technology 2024年第四届激光,光学和光电子技术国际学术会议(LOPET 2024)将于2024年5月17日-19日在中国重庆举行。…

Mysql 删除数据

从数据表中删除数据使用DELETE语句&#xff0c;DELETE语句允许WHERE子句指定删除条件。DELETE语句基本语法格式如下&#xff1a; DELETE FROM table_name [WHERE <condition>]; table_name指定要执行删除操作的表&#xff1b;“[WHERE <condition>]”为可选参数&a…

利用OpenCV检测物流过程中的暴力拆箱和暴力拿放行为

背景介绍&#xff1a; 随着电子商务的快速发展&#xff0c;物流行业面临着越来越多的挑战。其中&#xff0c;暴力拆箱和暴力拿放成为最突出的问题之一。这些行为不仅会导致货物损坏&#xff0c;还会给物流公司和消费者带来巨大的经济损失。传统的解决方法依赖于人工监控&#x…

C语言应用实例——贪吃蛇

&#xff08;图片由AI生成&#xff09; 0.贪吃蛇游戏背景 贪吃蛇游戏&#xff0c;最早可以追溯到1976年的“Blockade”游戏&#xff0c;是电子游戏历史上的一个经典。在这款游戏中&#xff0c;玩家操作一个不断增长的蛇&#xff0c;目标是吃掉出现在屏幕上的食物&#xff0c…

什么是数据API接口,数据API有哪些应用?

​自2020年4月“数据”正式被纳入生产要素范围以来&#xff0c;已经和其它生产要素一起融入经济价值创造过程&#xff0c;近年来我国数据交易市场规模迅速增长&#xff0c;数据需求逐年扩增&#xff0c;“数据”日益成为推动数字中国建设和加快数字经济发展的重要战略资源。 作…

C# Socket 允许控制台应用通过防火墙

需求&#xff1a; 在代码中将exe添加到防火墙规则中&#xff0c;允许Socket通过 添加库引用 效果&#xff1a; 一键三联 若可用记得点赞评论收藏哦&#xff0c;你的支持就是写作的动力。 源地址: https://gist.github.com/cstrahan/513804 调用代码: private static void …

idea报错:Cannot resolve symbol ‘springframework‘

说明maven没有配置好或者加载好 解决&#xff1a; 1&#xff09;File–>Invalidate Caches… 清理缓存&#xff0c;重启idea客户端 然后我这里只进行了第一步就不报错了&#xff01;&#xff01;&#xff01; 如果你依然报错&#xff0c;就继续第二步&#xff1a; 2&…

3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM

一、css设置样式的方式总结&#xff1a; 对象.style.css属性 对象.className ‘’ 会覆盖原来的类 对象.setAttribut(‘style’,‘css样式’) 对象.setAttribute(‘class’,‘类名’) 对象.style.setProperty(css属性名,css属性值) 对象.style.cssText “css样式表” …

Linux:重定向

Linux&#xff1a;重定向 输出重定向追加重定向输出重定向与追加重定向的本质输入重定向 输出重定向 在Linux中&#xff0c;输出重定向是一种将命令的输出发送到不同位置的方法。通常&#xff0c;执行命令时&#xff0c;输出会显示在终端上。然而&#xff0c;使用输出重定向&a…

[AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…