Common Intermediate Language (CIL) assembler available as a library and command-line tool (like ilasm
). It is based on a CIL assembler code taken out from the Mono runtime, including the CIL parser autogenerated by the Jay tool (which in turn was a C# port of a Berkeley Yacc parser for Java).
Current refactorings include:
- main class
Driver
usage change - using
MemoryStream
instead of files directly - error reporting
- initial unit tests
- CLI runner extracted and command line parsing
- logger abstraction
- minor renaming
This is part of Mobius project - experimental .NET runtime running on .NET Core.
Definitely the most useful use case, as it is the first available .NET library that you can use to assemble textual CIL files.
Currently it targets .NET Standard 2.0 and is also available as Mobius.ILasm NuGet package.
// Read some CIL code
var cil = File.ReadAllText(@"./trivial/helloworldconsole.il");
var logger = new Logger();
var driver = new Driver(logger, Driver.Target.Dll, showParser: false, debuggingInfo: false, showTokens: false);
// Assemble
using var memoryStream = new MemoryStream();
driver.Assemble(new [] { cil }, memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
// Load assembled binary stream into AsemblyLoadContext and execute
var assemblyContext = new AssemblyLoadContext(null);
var assembly = assemblyContext.LoadFromStream(memoryStream);
var entryPoint = assembly.EntryPoint;
var result = entryPoint?.Invoke(null, new object[] { new string[] { } });
Note: Due to the early stage of development, and some legacy code improvements, the available API is subject to change in future versions.
Typical usage is just to assembly a spefied il
file:
> `mobius.ilasm.cil -I helloworld.il`
which will produce helloworld.dll
that you can execute by dotnet
command (if your provide hellologger.runtimeconfig.json
). Additionaly, for Windows, you can produce EXE file that will be self-executable.
All options available:
InputFile* (-I) IL file to be parsed
OutputFile (-O)
Target (-T) [Default='Dll']
Dll
Exe
NoAutoInherit (-nai)
Debug (-D) [Default='False']
ShowParser (-sp) [Default='False']
ShowTokens (-st) [Default='False']
StrongKeyFile (-S) Strongname using the specified key file
StrongKeyContainer (-Str) Strongname using the specified key container