zoukankan      html  css  js  c++  java
  • 使用.Net Core RT 标准动态库

    这个文档可以引导你如何通过CoreRT生成一个原生标准的系统动态库让其他编程语言调用. CoreRT 可以构建静态库, 这些库可以在编译时链接或者也可以构建运行时所需的共享库,

    创建一个支持CoreRT的 .NET Core 类库项目

    使用 dotnet new console -o NativeLibrary 创建一个.NET Core类库项目并参考Hello world 示例为项目加入 CoreRT 的支持.

    生成静态库

    > dotnet publish /p:NativeLib=Static -r <RID> -c <Configuration>
    
    

    <Configuration> 是你项目的配置 (比如Debug 或者 Release) 和 <RID> 是运行时标识(可以是 win-x64, linux-x64, osx-x64其中之一).比如,你想发布一个 release 配置并且是Windows 64位动态库的时候命令行你可以这么写:

    > dotnet publish /p:NativeLib=Static -r win-x64 -c release
    
    

    上面的命令将删掉一个静态库 (Windows .lib, OSX/Linux .a) 用 ./bin/[configuration]/netstandard2.0/[RID]/publish/文件夹并将有一个同名文件夹在你的源码文件夹呈现。

    生成共享库

    > dotnet publish /p:NativeLib=Shared -r <RID> -c <Configuration>
    
    

    上面的命令将删掉共享库 (Windows .dll, OSX .dylib, Linux .so) 在 ./bin/[configuration]/netstandard2.0/[RID]/publish/ 文件夹并将有一个同名文件夹在你的源码中呈现.生成共享库在Linux上目前截止2018年12月6日不能正常工作, 详情查看 #4988.

    导出方法

    针对一个 C# 方法再本地原生动态库被外部程序调用, 必须要使用 [NativeCallable] 属性进行导出. 首先定义NativeCallable 类在哪i的项目中,请查看这里.本地定义 NativeCallable是一个临时解决方法,正式发布的时候会添加到.Net Core 内.

    下一步,在要导出的方法上使用 EntryPoint 和 CallingConvention 属性:

    [NativeCallable(EntryPoint = "add", CallingConvention = CallingConvention.StdCall)]
    public static int Add(int a, int b)
    {
        return a + b;
    }
    
    

    在原生动态库生成后, C# 的Add 方法被导出为add 函数功其他语言调用. 在决定要导出的托管方法时, 需要考虑以下一些限制:

    • 导出方法必须是静态.
    • 导出方法只能是原生可接收或值类型(比如结构 ),他们必须封装所有引用类型参数 .
    • 无法从常规托管 c# 代码调用导出的方法, 会有发生异常.
    • 导出的方法不能使用常规的 C# 异常捕获,必须使用错误代码替换.

    引用

    真实案例如何使用 CoreRT编写用于Rust的原始动态库: https://medium.com/@chyyran/calling-c-natively-from-rust-1f92c506289d

  • 相关阅读:
    网站如何知道浏览器的用户在使用什么语言?
    安装 Couchbase 服务器
    windows Phone 浏览器窗口的尺寸
    【leetcode】 9. palindrome number
    Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示
    UVA 12487 Midnight Cowboy(LCA+大YY)(好题)
    Jenkins——应用篇——插件使用——Publish over SSH
    Linux经常使用命令(三)
    c++引用总结
    quickcocos2dx framework环境变 fatal error C1083: 无法打开源文件:“.Box2D/Dynamics/b2World.h”: No such file or d
  • 原文地址:https://www.cnblogs.com/MysticBoy/p/10076964.html
Copyright © 2011-2022 走看看