在C语言中实现跨语言调用通常意味着你想要从其他编程语言(如Python、Java、C#等)调用C语言编写的函数。这可以通过多种方式实现,以下是一些常见的方法:### 1. 使用C语言库最简单的方式是将C语言代码编译成一个库(.dll、.so、.dylib等

摘要:## 简介 上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它。 在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式
简介 上一篇文章使用C#编写一个.NET分析器文章发布以后,很多小伙伴都对最新的NativeAOT函数导出比较感兴趣,今天故写一篇短文来介绍一下如何使用它。 在以前,如果有其他语言需要调用C#编写的库,那基本上只有通过各种RPC的方式(HTTP、GRPC)或者引入一层C++代理层的方式来调用。 自从微软开始积极开发和研究Native AOT以后,我们有了新的方式。那就是直接使用Native AOT函数导出的方式,其它语言(C++、Go、Java各种支持调用导出函数的语言)就可以直接调用C#导出的函数来使用C#库。 废话不多说,让我们开始尝试。 开始尝试 我们先来一个简单的尝试,就是使用C#编写一个用于对两个整数求和的Add方法,然后使用C语言调用它。 1.首先我们需要创建一个新的类库项目。这个大家都会了,可以直接使用命令行新建,也可以通过VS等IDE工具新建。 dotnet new classlib -o CSharpDllExport 2.为我们的项目加入Native AOT的支持,根据.NET的版本不同有不同的方式。 如果你是.NET6则需要引入Microsoft.DotNet.ILCompiler这个Nuget包,需要指定为7.0.0-preview.7.22375.6,新版本的话只允许.NET7以上使用。更多详情请看hez2010的博客 https://www.cnblogs.com/hez2010/p/dotnet-with-native-aot.html 如果是.NET7那么只需要在项目属性中加入<PublishAot>true</PublishAot>即可,笔者直接使用的.NET7,所以如下配置就行。 3.编写一个静态方法,并且为它打上UnmanagedCallersOnly特性,告诉编译器我们需要将它作为函数导出,指定名称为Add。 using System.Runtime.InteropServices; namespace CSharpDllExport { public class DoSomethings { [UnmanagedCallersOnly(EntryPoint = "Add")] public static int Add(int a, int b) { return a + b; } } } 4.使用dotnet publish -p:NativeLib=Shared -r win-x64 -c Release命令发布共享库。共享库的扩展名在不同的操作系统上不一样,如.dll、.dylib、.so。当然我们也可以发布静态库,只需要修改为-p:NativeLib=Static即可。 5.使用DLL Export Viewer工具打开生成的.dll文件,查看函数导出是否成功,如下图所示,我们成功的把ADD方法导出了,另外那个是默认导出用于Debugger的方法,我们可以忽略。工具下载链接放在文末。 6.编写一个C语言项目来测试一下我们的ADD方法是否可用。
阅读全文