使用.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:利用静态函 ...
随机推荐
- libcloud代码研究(二)——云服务封装
对Ali OSS和百度云存储的封装 先在libcloud.storage.provider文件中添加Ali OSS provider和Baidu provider,在DRIVERS中添加如下 ...
- GROOVY简单语法实习
慢慢的看<GROOVY IN ACTION>的一个中文节译本,根据上面的东东慢慢练习. 中文看起来确实比英文快好多...:) Book gina = new Book('Groovy in ...
- 数组优化 Dijkstra 最短路
//============================================================================// Name : POJ.cpp// Au ...
- data guard 的redo 传输
data guard 通过把redo从primary数据库传输到standby数据库并应用在standby数据库来实现自己的功能. redo 传输是有2种模式 1. 同步 sync 2. 异步 asy ...
- Spark 颠覆 MapReduce 保持的排序记录
在过去几年,Apache Spark的採用以惊人的速度添加着,通常被作为MapReduce后继,能够支撑数千节点规模的集群部署. 在内存中数 据处理上,Apache Spark比MapReduce更加 ...
- LeetCode258——Add Digits
Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. ...
- jQuery Validation让验证变得如此easy(三)
下面代码进行对jQuery Validation的简单演示包含必填项.字符长度,格式验证 一.引入文件 <script src="js/jquery-1.8.0.min.js" ...
- selenium清空默认文字
默认输入框 鼠标点击上去还有文案 直接用 clear不可以
- effective C++ 读书笔记 条款11
条款11: 在operator= 中处理"自我赋值" 在实现operator=时考虑自我赋值是必要的就像 x=y .我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指 ...
- SQL排他锁的解决方案
SQL排他锁的解决方案 分类: 事务与锁 数据库管理维护2009-04-28 22:41 680人阅读 评论(0) 收藏 举报 sql数据库database服务器killdisk 问题描述: 我有一个 ...