我使用
runtime.win-x64.Microsoft.NETCore.ILAsm
nuget 来获取 ilasm.exe 来编译我的 CIL 代码。它为 windows .exe PE 正确编译了所有内容,但显然它没有为 Linux 和 MacOS 编译...
我知道使用 .NET 5.0 或更新版本的
dotnet --runtime
命令可以针对任何支持的操作系统进行编译。如何使用 CIL 而不是 C# 来做到这一点?我以为它在使用ilasm.exe
,但显然这是不可能的,那么解决方案是什么?
注意:我已经用过linux
ilasm
在linux上编译的代码是一个.exe PE,在linux上不起作用的扩展和格式(linux使用ELF格式)
如果你正在做实验,你可以用Mono运行时运行
.exe
,mono your.exe
.
虽然.NET CLI也应该接受它
dotnet your.exe
,但您需要添加支持文件,例如.dep.json
,以指定运行时等信息。
顺便说一句,就像评论指出的那样,在 .NET Core SDK 中使用本机 IL 支持是更好的方法。
为了编译 MSIL,我使用以下模板:
ProjectName
|- ProjectName.ilproj
|- Program.il
ProjectName.ilproj
内容:
<Project Sdk="Microsoft.Net.Sdk.il/7.0.0">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
</PropertyGroup>
</Project>
Program.il
内容:
.assembly extern mscorlib {}
.assembly 'App' {}
.class private auto ansi beforefieldinit abstract sealed Program extends [mscorlib]System.Object {
.method private hidebysig static void Main ( string[] args) cil managed {
.entrypoint
ldstr "hw"
call void [mscorlib]System.Console::WriteLine(string)
ret
}
}
此设置使我可以毫无问题地编译程序。命令
dotnet build -r linux-x64 --self-contained -c release
和 dotnet build -r win-x64 --self-contained -c release
似乎可以工作并产生一些特定于平台的输出