使用.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
使用.Net Core RT 标准动态库的更多相关文章
- (27)ASP.NET Core .NET标准REST库Refit
1.简介 Refit是一个受到Square的Retrofit库(Java)启发的自动类型安全REST库.通过HttpClient网络请求(POST,GET,PUT,DELETE等封装)把REST AP ...
- C 高级编程3 静态库与动态库
http://blog.csdn.net/Lux_Veritas/article/details/11934083http://www.cnblogs.com/catch/p/3857964.html ...
- linux中C的静态库和动态库分析
从开始学C语言写第一个"hello world"历程到现在,我依然困惑于到底这个程序完整的执行流程是什么样的.不过,现在我正在尝试一点一点的揭开它的面纱.现在,我尝试分析linux ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库
前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...
- Android NDK开发及调用标准linux动态库.so文件
源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...
- JSTL教程 [JSP 标准标记库]
JSTL教程- - JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式 ...
- ios 开发中 动态库 与静态库的区别
使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库, ...
- iOS 静态库和动态库的区别&静态库的生成
linux中静态库和动态库的区别 一.不同 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函 ...
随机推荐
- Configuration must specify a spooling directory
启动spooling源时报错: 原因:spooling配置文件有误 a1.sources.r1.type = spooldir a1.sources.r1.spooldir = /usr/local/ ...
- hdu_1060_Leftmost Digit_201311071827-2
Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- C. Vladik and Memorable Trip DP
C. Vladik and Memorable Trip time limit per test 2 seconds memory limit per test 256 megabytes input ...
- [bzoj2989]数列_KD-Tree_旋转坐标系
数列 bzoj-2989 题目大意:题目链接. 注释:略. 想法:显然,我们用x和a[x]两个值建立笛卡尔坐标系. 两个点之间的距离为曼哈顿距离. 修改操作就是插入... 查询操作就是查询一个点周围的 ...
- HDU 4542
T_T终于让我过了,坑啊,竟然时限是200ms... 我是预处理出不整除了个数的,因为这个较容易一点.利用算术基本定理,f=p1^a1*p2^a2...... 所以,整除它的个数就是(a1+1)*(a ...
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 • PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文 ...
- apache禁止訪问某些文件或文件夹的方法
[apache配置禁止訪问] 1. 禁止訪问某些文件/文件夹 添加Files选项来控制,比方要不同意訪问 .inc 扩展名的文件,保护php类库: <Files ~ "\.inc$&q ...
- [ACM] POJ 1942 Paths on a Grid (组合)
Paths on a Grid Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 21297 Accepted: 5212 ...
- python 004 执行环境对比
对比:os.system os.popen subprocess.Popen subprocess.call 为什么要搞这么多? # --*--encoding: utf-8--*-- import ...
- SIPp web frontend(2)
SIP VoIP 測试交流群: 323827101 欢迎大家转载.为保留作者成果,转载请注明出处.http://blog.csdn.net/netluoriver,有些文件在资源中也能够下载.假设你没 ...