前言
Common Language Runtime(CLR) 是一个很强大的运行时, 它接收 Common Intermediate Language(CIL) 的输入并最终产生机器代码并执行. CIL 在 CLR 上相当于 ASM 汇编代码的存在.
CLR 之上的语言 C#,F#,VB.NET 等语言的类型系统固然设计得不错, 但是有的时候我们需要一些操作绕过类型系统的检查, 或者有的时候语言本身并不能满足我们的需求.
需要使用 CIL 的常见场景:
我们需要绕过类型系统, 在类型系统上面 "开洞".
我们需要优化程序的性能, 直接使用 CIL 编程可以如同使用汇编一样完全的控制程序的逻辑, 对程序进行人肉优化.
直接利用 C#,F# 等语言编译成的 CIL 有其独特的模式, 容易被反编译软件从 CIL 还原为源代码, 而如果直接采用 CIL 编程则很容易避开编译器生成代码的固有模式, 使得代码无需进行任何混淆即可让所有反编译器失效.
需要注意: CLR 的 JIT 部分优化依赖于 CIL 的特定模式, 直接采用 CIL 进行编程而不利用 C# 等语言的编译器生成特定模式的 CIL 可能导致优化失效, 如向量化, 模式匹配缓存和常数时间优化等, 因此在直接使用 CIL 进行编程时最好对 CLR 的 JIT 有一定了解, 以规避潜在的性能问题, JIT 的源代码在 .
准备工作
首先我们创建一个 .NET Standard 项目:
- mkdir MyILProject
- cd MyILProject
- dotnet new classlib
然后创建 global.JSON 和 nuget.config 文件用于配置 SDK:
- dotnet new global
- dotnet new nuget
- {
- "msbuild-sdks": {
- "Microsoft.NET.Sdk.IL": "3.0.0-preview-27318-01"
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <configuration>
- <packageSources>
- <add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
- </packageSources>
- </configuration>
- <Project Sdk="Microsoft.NET.Sdk.IL">
- <PropertyGroup>
- <OutputType>Library</OutputType>
- <TargetFramework>netstandard2.1</TargetFramework>
- <DebugOptimization>IMPL</DebugOptimization>
- <DebugOptimization Condition="'$(Configuration)' == 'Release'">OPT</DebugOptimization>
- <MicrosoftNetCoreIlasmPackageVersion>3.0.0-preview-27318-01</MicrosoftNetCoreIlasmPackageVersion>
- </PropertyGroup>
- </Project>
- .assembly MyILProject
- {
- .ver 1:0:0:0
- }
- .module MyILProject.dll
- .class public auto ansi sealed MyILProject.Class1
- extends [System]System.Object
- {
- .method public hidebysig static int32 Hello(int32) cil managed
- {
- .maxstack 4
- ldstr "Hello World!"
- call void [System.Console]System.Console::WriteLine(string)
- ldarg.0
- ret
- }
- }
- cd ..
- mkdir Test
- cd Test
- dotnet new console
- dotnet add reference ../MyILProject
- using System;
- using MyILProject;
- namespace Test
- {
- class Program
- {
- static void Main(string[] args)
- {
- Console.WriteLine(Class1.Hello(25));
- }
- }
- }
- .method public hidebysig specialname rtspecialname instance void .ctor () cil managed
- {
- .maxstack 8
- ldarg.0
- call instance void [System.Private.CoreLib]System.Object::.ctor()
- nop
- ret
- }
- Class.il(9): warning : Reference to undeclared extern assembly 'mscorlib'. Attempting autodetect [...\MyILProject.ilproj]
- Class.il(15): warning : Reference to undeclared extern assembly 'System.Console'. Attempting autodetect [...\MyILProject.ilproj]
- Class.il(26): warning : Reference to undeclared extern assembly 'System.Private.CoreLib'. Attempting autodetect [...\MyILProject.ilproj]
- .assembly extern System.Runtime
- {
- .publickeytoken = ( B0 3F 5F 7F 11 D5 0A 3A )
- .ver 4:0:0:0
- }
- .assembly extern System.Console
- {
- .publickeytoken = ( B0 3F 5F 7F 11 D5 0A 3A )
- .ver 4:0:0:0
- }
- .assembly extern System.Private.CoreLib
- {
- .publickeytoken = ( B0 3F 5F 7F 11 D5 0A 3A )
- .ver 4:0:0:0
- }
- <Project Sdk="Microsoft.NET.Sdk.IL">
- <PropertyGroup>
- <OutputType>Library</OutputType>
- <TargetFramework>netstandard2.1</TargetFramework>
- <DebugOptimization>IMPL</DebugOptimization>
- <DebugOptimization Condition="'$(Configuration)' == 'Release'">OPT</DebugOptimization>
- <MicrosoftNetCoreIlasmPackageVersion>3.0.0-preview-27318-01</MicrosoftNetCoreIlasmPackageVersion>
- <IlasmFlags>$(IlasmFlags) -INCLUDE=include</IlasmFlags>
- </PropertyGroup>
- </Project>
来源: https://www.cnblogs.com/hez2010/p/12374911.html