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

背景

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

方案

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

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

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第1张图片

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第2张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第3张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第4张图片

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; }
}

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第5张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第6张图片 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第7张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第8张图片 5、新建一个C# DotNet6 控制台空项目,命名为TestDllForWindows

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第9张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第10张图片 

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第11张图片 

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));
        }
    }
}

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第12张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第13张图片

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

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第14张图片

 

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

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第15张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第16张图片 

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第17张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第18张图片 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第19张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第20张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第21张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第22张图片Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第23张图片

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、右键单击项目名称,选择【发布】

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第24张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第25张图片 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第26张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第27张图片 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第28张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第29张图片

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第30张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第31张图片

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第32张图片

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

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第33张图片

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

./TestSoForLinux 

 Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第34张图片

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用_第35张图片

你可能感兴趣的:(visual,studio,c++,windows,c#,dll,so,linux)