zoukankan      html  css  js  c++  java
  • 跨平台开发 -- C# 使用 C/C++ 生成的动态链接库

    操作环境:Visual Studio 2017

    如何实现 使用 C# 进行嵌入式开发?

    .NET Core 虽然实现了跨平台,但是不可能处处使用 C# 开发,就好像没人使用SQL开发安卓APP,每种语言都有其优秀的地方和局限性。

    就传感器、32位、16位嵌入式设备,可能只有那么几KB的存储器,那些串口、针脚、电路、信号,只能使用C语言开发。就Linux来说,Linux 本身是C语言开发的,面向C语言有丰富的接口支持和兼容,还有很多地方只能使用C语言。

    底层应用可以用C语言来完成,如果要开发一个网站、一个大型应用程序呢?

    我们可以先用 C 语言写好底层API接口,生成 .SO 动态链接库,然后使用 C# 引入 C 语言动态链接库。利用C语言进行底层的接口开发,使用.NET Core/C# 实现跨平台应用开发,通过预先自定义的API,就可以掌控全局。

    一,在Visual Studio 2017 上安装 C/C++ 支持

    这一步是是为了在 VS 2017上一套开发,也可以使用其它工具开发C语言程序,甚至在 Linux 中使用 vim 编写、编译都行。

    二,写一个简单的C语言程序、生成动态链接库

    创建项目后,点击属性,选择生成 .so

    然后新建一个 test.cpp 文件,右键 - 新建项,C语言代码如下

    extern “C” {}

    表示{}内的方法函数等可以为外部使用

    extern "C" 
    {
        int Sum(int a,int b) {
            return a + b;
        }
    }

    右键-生成

    然后会要求你添加一个 Linux 主机连接。这里其实加上了没用,但vs必须要你加上才能生成、编译,实际对我们后面的操作没影响。

     接下来,看图操作

    点击菜单栏的生成-仅用于项目-仅链接xxx

    然后下面下面输出栏会报错,不管他,再点击项目-右键生成

    之后会生成 .so 文件,复制.so文件,存放好

    三,C# 项目使用此动态链接库

    建立一个.NET Core 项目,把 .so 文件复制进去,记得 “始终复制”

    新建一个类,类名不重要,主要的是方法名称要一致,参数一致

    头部引入

    using System.Runtime.InteropServices;

    类的代码如下

    然后使用此类库

     public class Test
        {
            [DllImport("./libProject2.so",CallingConvention =CallingConvention.Cdecl)]
            public static extern int Sum(int a,int b);
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(Test.Sum(666,666));
                while (true)
                {
                    Console.WriteLine("输入两个数,用空格隔开,如 666 666");
                    string[] vs = Console.ReadLine().Split(" ");
                    int a = Convert.ToInt32(vs[0]);
                    int b = Convert.ToInt32(vs[1]);
                    Console.WriteLine(Test.Sum(a,b));
                }
            }
        }

    发布后打包到 Linux 中运行

    笔者现在正在实习,学习范围物联网、嵌入式Linux、云计算、.NET Core。

    以上只是在 C# 项目中使用 C语言项目的简单例子,笔者实现了.NET Core 开发项目管理设备、对接阿里云IOT,文章正在撰写中。

  • 相关阅读:
    为什么世界上没有安全的工作?
    GIT学习----第六节:撤销修改
    vue-cli中koa输出console.log报错的解决方案
    简易版promise源码实现
    bind函数的模拟实现
    Es6语法实现的转盘抽奖效果——可配置转盘的抽奖概率
    探寻Object.assign内部的奥秘
    promise基本使用——简单的运动效果
    数组sort方法源码解析
    ES5数组一些常用的方法源码实现
  • 原文地址:https://www.cnblogs.com/whuanle/p/10582654.html
Copyright © 2011-2022 走看看