一:背景
1. 讲故事
昨晚训练营里有一位朋友提到一个问题,说 C# AOT程序能否编译为一个dll,供其他语言调用,其实这个是完全没有问题的,也确实我的的文章体系中没有涉及到这块,那今天就补充完整吧。
二:NativeAOT 函数导出
1. 简单的案例
在 C 中我相信很多人都知道用 dllexport 进行函数导出,如下所示:
在 C# 中其实也差不多,用 UnmanagedCallersOnly 特性替代即可,接下来创建一个 C# 的类库,参考代码如下:
在 csproject 中追加最后二行,其中的 <NativeLib>Shared</NativeLib> 表示可以生成动态链接库,即 windows 上的 .dll 以及 linux 上的 .so 文件。
配置好之后就可以用 dotnet publish 发布为 windows 的原生动态链接库,参考如下:
生成好 dll 之后可以用 PPEE 工具观察下 export 表,打开之后果然有了 ComplexCalculation 函数。

接下来大家可以把这个 dll 提供给 C 或者 C# 去调用,只要 PE头里有,怎么开心怎么玩。
这里新建一个 Example_20_1_6 的 C# 控制台程序,使用传统的 DllImport 导入外部方法,就像以前引入C的外部方法一样,参考代码如下:
将 Example_20_1_1.dll 拷贝到当前的bin目录下,运行程序之后,一切ok,截图如下:

2. linux 上的投放
刚才只是在 windows 平台上的演示,接下来试部署到 ubuntu 上,正常情况下你可能不会那么一帆风顺,不是缺少这个库就是那个库,比如下面的报错。
上面就是典型的缺少 zlib 包,安装一下即可,所以大家也是根据报错一个一个解决,最终肯定会走出迷雾。
有了这个 so 文件后,接下来我们新建一个 c文件,参考代码如下:
使用 vscode 远程调试,哈哈,得到了我们想要的结果,截图如下:

三:总结
这篇我们演示了 windows 上的 C# 调用 C# AOT 及 linux 上的 C 调用 C# AOT,是不是挺有意思,也算是给训练营学员提供的一份资料参考。

303

被折叠的 条评论
为什么被折叠?



