Giter Site home page Giter Site logo

inlineil.fody's Introduction

InlineIL.Fody Logo

Build NuGet package GitHub release License

This is an add-in for Fody which lets you inject arbitrary IL into your assembly at compile time.

The following C# code Is compiled to the following IL
using static InlineIL.IL.Emit;

public static class Example
{
    public static void ZeroInit<T>(ref T value)
        where T : struct
    {
        Ldarg(nameof(value));
        Ldc_I4_0();
        Sizeof(typeof(T));
        Unaligned(1);
        Initblk();
    }
}
.method public hidebysig static void ZeroInit
    <valuetype .ctor
      ([System.Runtime]System.ValueType) T> (
    !!T& 'value'
  ) cil managed 
{
  .maxstack 8

  IL_0000: ldarg.0
  IL_0001: ldc.i4.0
  IL_0002: sizeof !!T
  IL_0008: unaligned. 1
  IL_000b: initblk
  IL_000d: ret
}

Installation

  • Include the Fody and InlineIL.Fody NuGet packages with a PrivateAssets="all" attribute on their <PackageReference /> items. Installing Fody explicitly is needed to enable weaving.

    <ItemGroup>
      <PackageReference Include="Fody" Version="..." PrivateAssets="all" />
      <PackageReference Include="InlineIL.Fody" Version="..." PrivateAssets="all" />
    </ItemGroup>
  • If you have a FodyWeavers.xml file in the root directory of your project, add the <InlineIL /> tag there. Otherwise, the following file will be created on the first build if it doesn't exist:

    <?xml version="1.0" encoding="utf-8" ?>
    <Weavers>
      <InlineIL />
    </Weavers>

See Fody usage for general guidelines, and Fody configuration for additional options.

Usage

Call static methods of the InlineIL.IL.Emit class to emit IL instructions. That's it. ๐Ÿ˜‰

A few more things which are good to know:

  • The InlineIL.IL class exposes methods for handling labels and local variables, and some utilities (see below).

  • System.Type is implicitly convertible to InlineIL.TypeRef: when you see a TypeRef parameter, you can use the typeof keyword in most cases.

  • You can use the IL.Push method to push anything onto the evaluation stack. In particular, this lets you access C# variables, as you cannot emit an ldloc instruction for those.

  • You can add the using static InlineIL.IL.Emit; directive to get rid of the IL.Emit prefix.

  • You don't have to emit instructions in their short form, they will be shortened automatically (e.g. ldarg.0 will be emitted instead of ldarg 0).

  • Most types used as operands declare instance methods which change their meaning and can be chained, for instance: new TypeRef(...).MakeArrayType().MakeByRefType().

  • You can combine InlineIL instructions with existing C# code: a given method doesn't have to be entirely written in IL. After weaving, the reference to the InlineIL assembly is removed from your project.

Methods

  • IL.Emit.*
    Every method call on the IL.Emit class will be replaced by the IL instruction it represents.
    Note that all arguments to these methods need to be constructed in place (i.e. the instruction needs to be representable in IL).

  • IL.DeclareLocals
    Declares local variables. Supports changing the init flag and pinned variables. Local variables can be referenced by name or by index.

  • IL.MarkLabel
    Marks a label at a given position in the code.

  • IL.Push, IL.PushInRef, IL.PushOutRef
    Pushes the provided argument onto the evaluation stack. Does not require a constant argument, any expression should work. If an error is raised in optimized builds, try to use IL.EnsureLocal to change the layout of the IL emitted by the compiler, so it becomes compatible.

  • IL.Pop
    Pops a value from the evaluation stack into a local variable or static field.

  • IL.Unreachable
    Marks an unreachable code region, for instance just after a ret instruction. Necessary when the compiler's control flow analysis requires a code statement.
    Usage: throw IL.Unreachable();

  • IL.Return, IL.ReturnRef, IL.ReturnPointer
    Helper methods to return the value from the top of the evaluation stack.
    Example usage: return IL.Return<int>();

  • IL.EnsureLocal
    Helper method that forces the compiler to emit an IL local for the supplied local variable, instead of keeping its value on the evaluation stack only. This can let a local variable be used with IL.Push in optimized builds, where the IL layout wouldn't allow it otherwise.

Types

  • TypeRef
    A class which represents a type. Note that System.Type is implicitly convertible to TypeRef, so you can directly write typeof(int) for instance where a TypeRef parameter is expected.

  • MethodRef
    A method reference. Exposes a simple constructor for methods without overloads, and some more detailed ones for overload disambiguation. Additional static factory methods for referencing underlying methods of properties and events are provided for convenience.
    Use TypeRef.TypeGenericParameters[N] and TypeRef.MethodGenericParameters[N] to represent the generic parameter of index N in MethodRef calls which involve overload resolution.

  • FieldRef
    A field reference.

  • StandAloneMethodSig
    A method signature for use as an operand to the calli instruction.

  • LocalVar
    Declares a local variable (with an optional name), for use with IL.DeclareLocals. Implicitly convertible from System.Type if you don't want to use named locals or pinning.

Configuration

The <InlineIL /> element in FodyWeavers.xml accepts the following attributes:

  • SequencePoints="True|False|Debug|Release", default value: Debug
    Defines if sequence points should be generated for each emitted IL instruction. The default Debug value improves the debugging experience in Debug builds without impacting the JIT codegen in Release builds.

  • Warnings="Warnings|Ignore|Errors", default value: Warnings
    Defines how warnings should be handled. Ignore hides them, while Errors turns them into errors.

Examples

inlineil.fody's People

Contributors

ltrzesniewski avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.