字数 481,阅读大约需 3 分钟
仓颉语言与.net9的互操作【进阶版】
前言
本篇作为之前发表的《仓颉语言调用.net9 C#编写的dll》补充及一些朋友提的issue
答疑,默认阅读者已经看过我之前的文章,重复的知识点不再赘述。没有阅读过的朋友可以跳转先看下之前的文章。
仓颉语言调用.net9 C#编写的dll
内存泄漏问题
由于采用的是unsafe
的代码,所以系会有内存泄漏的风险的,但可通过及时的显式回收操作一定程度去规避其发生。详细可以去看下对应的commit[1]
C#调用仓颉的dll
1. 新建一个文件 mylib.cj
package CJinvokedotnet
// 定义C可见方法
@C
func myHello(): Unit {
println("您好,欢迎使用仓颉!")
}
2. 使用下面的命令编译可以得到一个 libCJinvokedotnet.dll
cjc mylib.cj --output-type=dylib
3. C#中通过 DllImport
导入libCJinvokedotnet.dll
的myHello
方法,并调用它
// 导入仓颉库的自定义方法
[DllImport("libCJinvokedotnet.dll", EntryPoint = "myHello")]
private static extern void myHello();
// 调用仓颉自定义库中的myHello方法
myHello();
Linux系统下的互调用
1. 把 Hello.cs
中的
[DllImport("libCJinvokedotnet.dll", EntryPoint = "myHello")]
修改为:
[DllImport("libCJinvokedotnet.so", EntryPoint = "myHello")]
仓颉在Linux系统默认编译出来的库为 .so 文件
2. CSLibrary.csproj
中的AssemblyName
需要加上lib
前缀,即
<AssemblyName>libCSLibrary</AssemblyName>
这样就能让编译出来的文件名为libCSLibrary.so
这是cjc编译器的一个约定
lib[arg].so
,为了让Linux下的cjc编译器能正确地识别出文件,具体可以看下官方文档[2]
3. 最终编译出来的 main
文件,需要给与其可执行权限
chmod +x main
Linux下的build.sh
脚本使用
1. 赋予可执行权限
chmod +x build.sh
2. 可加架构参数,如笔者使用的是树莓派4B,所以在后面加 arm64
,不加则默认为x64
./build.sh arm64
引用链接
[1]
commit: https://github.com/lishewen/CJinvokedotnet/commit/929b7c52badaac4324f9d9b17be1654199630ba0#diff-c6df046d600d19cfbeafa4e688121f03d735197aad1076ede4eb3235635ab69c[2]
官方文档: https://cangjie-lang.cn/docs?url=%2F1.0.0%2Fuser_manual%2Fsource_zh_cn%2FFFI%2Fcangjie-c.html
本文暂时没有评论,来添加一个吧(●'◡'●)