Skip to content

oleg-st/InlineMethod.Fody

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 

Repository files navigation

InlineMethod.Fody

NuGet package

This is an add-in for Fody which lets you inline methods in compile time.



Installation

  • Install the NuGet packages Fody and InlineMethod.Fody. Installing Fody explicitly is needed to enable weaving.

    PM> Install-Package Fody
    PM> Install-Package InlineMethod.Fody
    
  • Add the PrivateAssets="all" metadata attribute to the <PackageReference /> items of Fody and InlineMethod.Fody in your project file, so they won't be listed as dependencies.

  • If you already have a FodyWeavers.xml file in the root directory of your project, add the <InlineMethod /> tag there. This file will be created on the first build if it doesn't exist:

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

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

Usage

Add the [InlineMethod.Inline] attribute to the methods that you need to inline. Private inline methods will be removed by default. Use [InlineMethod.Inline(false)] to keep them.

Example

What you write:

static unsafe int Read32(void* memPtr) => *(ushort*) memPtr;

[InlineMethod.Inline]
static unsafe int Read32WithInline(void* memPtr) => *(ushort*)memPtr;

public void Test()
{
    ulong x = 5;
    int y = Read32(&x);
}

public void TestWithInline()
{
    ulong x = 5;
    int y = Read32WithInline(&x);
}

What gets compiled:

  .method private hidebysig static int32 
          Read32(void* memPtr) cil managed
  {
    // Code size       3 (0x3)
    .maxstack  8
    IL_0000:  ldarg.0
    IL_0001:  ldind.u2
    IL_0002:  ret
  } // end of method Program::Read32

  .method public hidebysig instance void 
          Test() cil managed
  {
    // Code size       13 (0xd)
    .maxstack  1
    .locals init (uint64 V_0)
    IL_0000:  ldc.i4.5
    IL_0001:  conv.i8
    IL_0002:  stloc.0
    IL_0003:  ldloca.s   V_0
    IL_0005:  conv.u
    IL_0006:  call       int32 SampleConsole.Program::Read32(void*)
    IL_000b:  pop
    IL_000c:  ret
  } // end of method Program::Test

  .method public hidebysig instance void 
          TestWithInline() cil managed
  {
    // Code size       9 (0x9)
    .maxstack  1
    .locals init (uint64 V_0)
    IL_0000:  ldc.i4.5
    IL_0001:  conv.i8
    IL_0002:  stloc.0
    IL_0003:  ldloca.s   V_0
    IL_0005:  conv.u
    IL_0006:  ldind.u2
    IL_0007:  pop
    IL_0008:  ret
  } // end of method Program::TestWithInline