编程技术分享平台

网站首页 > 技术教程 正文

仓颉语言与.net9的互操作【进阶版】

xnh888 2025-07-19 23:30:15 技术教程 3 ℃ 0 评论

字数 481,阅读大约需 3 分钟

仓颉语言与.net9的互操作【进阶版】

前言

本篇作为之前发表的《仓颉语言调用.net9 C#编写的dll》补充及一些朋友提的issue答疑,默认阅读者已经看过我之前的文章,重复的知识点不再赘述。没有阅读过的朋友可以跳转先看下之前的文章。

仓颉语言调用.net9 C#编写的dll

内存泄漏问题

由于采用的是unsafe的代码,所以系会有内存泄漏的风险的,但可通过及时的显式回收操作一定程度去规避其发生。详细可以去看下对应的commit[1]

C#调用仓颉的dll

  1. 1. 新建一个文件mylib.cj
package CJinvokedotnet
// 定义C可见方法
@C
func myHello(): Unit {
println("您好,欢迎使用仓颉!")
}
  1. 2. 使用下面的命令编译可以得到一个libCJinvokedotnet.dll
cjc mylib.cj --output-type=dylib
  1. 3. C#中通过DllImport导入libCJinvokedotnet.dllmyHello方法,并调用它
// 导入仓颉库的自定义方法
[DllImport("libCJinvokedotnet.dll", EntryPoint = "myHello")]
private static extern void myHello();

// 调用仓颉自定义库中的myHello方法
myHello();

Linux系统下的互调用

  1. 1. 把Hello.cs中的
[DllImport("libCJinvokedotnet.dll", EntryPoint = "myHello")]

修改为:

[DllImport("libCJinvokedotnet.so", EntryPoint = "myHello")]

仓颉在Linux系统默认编译出来的库为 .so 文件

  1. 2. CSLibrary.csproj中的AssemblyName需要加上lib前缀,即
<AssemblyName>libCSLibrary</AssemblyName>

这样就能让编译出来的文件名为libCSLibrary.so

这是cjc编译器的一个约定lib[arg].so,为了让Linux下的cjc编译器能正确地识别出文件,具体可以看下官方文档[2]

  1. 3. 最终编译出来的main文件,需要给与其可执行权限
chmod +x main

Linux下的build.sh脚本使用

  1. 1. 赋予可执行权限
chmod +x build.sh
  1. 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


本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表