这个文档可以引导你如何通过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

使用.Net Core RT 标准动态库的更多相关文章

  1. (27)ASP.NET Core .NET标准REST库Refit

    1.简介 Refit是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库.通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST AP ...

  2. C 高级编程3 静态库与动态库

    http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...

  3. linux中C的静态库和动态库分析

    从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...

  4. 技巧:Linux 动态库与静态库制作及使用详解

    技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...

  5. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

  6. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  7. JSTL教程 [JSP 标准标记库]

    JSTL教程- - JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式 ...

  8. ios 开发中 动态库 与静态库的区别

    使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...

  9. iOS 静态库和动态库的区别&静态库的生成

    linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...

随机推荐

  1. [cf 599D] Spongebob and Squares

    据题意: $K=\sum\limits_{i=0}^{n-1}(n-i)*(m-i)$ $K=n^2m-(n+m)\sum{i}+\sum{i^2}$ 展开化简 $m=(6k-n+n^3)/(3n^2 ...

  2. [bzoj2086][Poi2010]Blocks_单调栈_双指针

    Blocks bzoj-2086 Poi-2010 题目大意:题目链接. 注释:略. 想法:首先,不难发现,如果连续的一段数的平均值不小于输入的k的话,这段数是满足题意的. 所以,我们再次简化一下:将 ...

  3. ZooKeeper的应用场景(转)

    应用场景1 :统一命名服务 分布式应用中,通常需要一套完备的命令机制,既能产生唯一的标识,又方便人识别和记忆. 我们知道,每个ZNode都可以由其路径唯一标识,路径本身也比较简洁直观,另外ZNode上 ...

  4. iptables防火墙原理详解+mysql pt工具

    http://seanlook.com/2014/02/23/iptables-understand/

  5. 固定一个div在浏览器底部

    转自原文 如何固定一个div在浏览器底部   方法1:使用CSS绝对定位 div{ position:absolute; bottom:0px; left:0px; } 方法2:使用CSS固定定位 d ...

  6. 2.2-VLAN间路由

    2.2-VLAN间路由     第一代LAN间的通信:     不支持VLAN的交换机:由一个路由器和几个交换机组成,每个交换机的所有端口都同属于一个网段/LAN:在路由器上有几个网段就有几个与之相对 ...

  7. 如何杀掉(kill)Oracle中的会话(Session)

    Oracle中造成一些表被死锁或者会话异常退出,如执行了更新记录操作后,既没有commit也没有rollback,网络就断开了,也会造表或记录被锁住,待到超时后才会被解开,那样都会造成应用操作被阻塞. ...

  8. Extjs学习笔记——Ext.data.JsonStore使用说明

    Ext.data.JsonStore继承于Ext.data.Store.使得从远程JSON数据创建stores更为方便的简单辅助类. JsonStore合成了Ext.data.HttpProxy与Ex ...

  9. 自己定义NumberPicker

    1.   项目中要用DatePicker 做时间选择用.但发现有android自带的好搓,就找了下有没有自己定义的时间选择控件. 找来找去发现github上的都时间控件都比較大.比較占手机屏幕的空间, ...

  10. Git 少用 Pull 多用 Fetch 和 Merge 【已翻译100%】【转】

    本文转载自:https://www.oschina.net/translate/git-fetch-and-merge?lang=chs&page=1# 本文有点长而且有点乱,但就像Mark ...