文档章节

使用.Net Core RT 生成标准动态库

麦壳饼
 麦壳饼
发布于 2018/12/06 15:28
字数 725
阅读 560
收藏 0

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

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

[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

© 著作权归作者所有

麦壳饼

麦壳饼

粉丝 22
博文 72
码字总数 4828
作品 7
昌平
高级程序员
私信 提问
Linux系统下CMake的安装和使用

一、介绍 “CMake”是“cross platform make”的缩写,是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装或编译过程。Cmake 并不直接建构出最终的软件,而是产生标准的...

牛牛牛大棚
2016/02/17
365
0
JSP中出现According to TLD or attribute directive i...

应用部署运行的时候出现JSP异常, 发生在使用JSTL库的时候: According to TLD or attribute directive in tag file, attribute value does not accept any expressions, 可能是因为使用了JSP...

李长春
2011/10/09
0
0
web.xml从2.3到2.4的issue

1,在web.xml不认解决办法: 2,应用部署运行的时候出现JSP异常, 发生在使用JSTL库的时候: According to TLD or attribute directive in tag file, attribute value does not accept any expres......

晨曦之光
2012/04/25
211
0
OpenSSL 项目路线图

本文档旨在描绘出OpenSSL项目的路线图。它是一个会日臻完善的在线文档。它应该被设定理想的目标和里程碑日期。 OpenSSL 项目当前看起来越来越迟滞和封闭。本路线图将尝试通过设定一些带有具体...

oschina
2014/07/02
4.7K
13
rt-thread的moudle源码分析

1 前言 大家都知道在windows操作系统中,可以运行一个个程序,这些程序大都是exe可执行文件,它是一个编译好的二进制文件,在windows下,在一个程序中还可以使用dll动态链接库dll文件,它同样...

长平狐
2013/03/19
877
0

没有更多内容

加载失败,请刷新页面

加载更多

掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

全文共6706字,预计学习时长12分钟或更长 近日,《狮子王》热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型、CGI动画、实景拍摄、VR等技术娴熟运用...

读芯术
30分钟前
1
0
C#经典面试题100道

1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34......

元歌
33分钟前
0
0
重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native C...

阿里云云栖社区
34分钟前
1
0
LeetCode 160: 相交链表 Intersection of Two Linked Lists

爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点。 Write a program to find the node at which the intersection of two singly linked lists begins. 如下面的两个链...

iCodeBugs
36分钟前
2
0
hadoop yarn漏洞 8088端口进入挖矿病毒处理记录

早上发现服务器cpu使用异常 进程如图所示 按照挖矿病毒的套路 肯定是定时任务不停地执行脚本 遂查看定时任务 进入/var/spool/cron 查看定时任务 发现里面有一个root文件 定时任务每分钟执行一...

詹姆斯-高斯林
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部