Extensible tool for weaving .net assemblies
Introduction
Manipulating the IL of an assembly as part of a build requires a significant amount of plumbing code. This plumbing code involves knowledge of both the MSBuild and Visual Studio APIs. Fody attempts to eliminate that plumbing code through an extensible add-in model.
The nuget package
https://www.nuget.org/packages/Fody/
PM> Install-Package Fody
Why?
This technique of "weaving" in new instructions is fantastically powerful. You can turn simple public properties into full INotifyPropertyChanged implementations, add checks for null arguments, add Git hashes to your Assemblies, even make all your string comparisons case insensitive.
The plumbing tasks Fody handles
- Injection of the MSBuild task into the build pipeline
- Resolving the location of the assembly and pdb
- Abstracts the complexities of logging to MSBuild
- Reads the assembly and pdb into the Mono.Cecil object model
- Re-applying the strong name if necessary
- Saving the assembly and pdb
Fody Uses Mono.Cecil and an add-in based approach to modifying the IL of .net assemblies at compile time.
- No install required to build
- No attributes required
- No references required
- Supports .net 3.5, .net 4, .net 4.5, .net 4.6, Silverlight 4, Silverlight 5, Windows Phone 7, Windows Phone 8, Metro on Windows 8, Mono, MonoTouch, MonoDroid and PCL
Usage
See SampleUsage for an introduction on using Fody.
Naming
The name "Fody" comes from the small birds that belong to the weaver family Ploceidae.
Tools and Products Used
Samples
- BasicFodyAddin A simple project meant to illustrate how to build an addin.
- FodyAddinSamples is a single solution that contains a working copy of every fody addin.
Addins List
- Anotar Simplifies logging through a static class and some IL manipulation.
- ArraySlice ArraySlice allows to build shared memory array views without performance impact. It uses IL manipulation to achieve the fastest implementation.
- AssertMessage Generates 'message' from sourcecode and adds it to assertion.
- AsyncErrorHandler Integrates error handling into async and TPL code.
- AutoDependencyProperty Generates WPF DependencyProperty boilerplate from automatic C# properties.
- AutoLazy Automatically implements the double-checked locking pattern on specified properties and methods.
- BasicFodyAddin A simple project meant to illustrate how to build an addin.
- Caseless Change string comparisons to be case insensitive.
- Catel For transforming automatic properties into Catel properties.
- Cilador Write your own mixins in C# for code reuse without inheritance.
- Commander Injects ICommand properties and implementations for use in MVVM applications.
- ConfigureAwait Allows you to set the async ConfigureAwait at a global level for all your await calls.
- Costura For embedding references as resources.
- CryptStr Encrypts literal strings in your .NET assemblies.
- DependencyInjection automatic dependency injection for Ninject, Autofac and Spring.
- EmptyConstructor Adds an empty constructor to classes even if a non empty one is defined.
- EmptyStringGuard Adds empty string argument checks to an assembly.
- EnableFaking Allows faking your types without writing interfaces for testing purposes only.
- Equals Generate Equals, GetHashCode and operators methods from properties.
- Expose Exposes members and optionally implements interface of a field declared in class.
- ExtraConstraints Facilitates adding constraints for Enum and Delegate to types and methods.
- FactoryId Simplifies the implementation of Factory Method Pattern
- Fielder Converts public fields to public properties.
- FodyDependencyInjection Dependency injection with Fody add-ins.
- Freezable Implements the Freezable pattern.
- InfoOf Provides
methodof
,propertyof
andfieldof
equivalents oftypeof
. - Ionad Replaces static method calls.
- Janitor Simplifies the implementation of IDisposable.
- JetBrainsAnnotations Leverage JetBrains Annotations without the need for JetBrainsAnnotations.dll.
- LoadAssembliesOnStartup Loads references on startup by using the types in the module initializer
- MethodCache Caches return values of methods decorated with a
CacheAttribute
. - MethodDecorator Decorate arbitrary methods to run code before and after invocation.
- MethodTimer Injects method timing code.
- Mixins A mixin is a class that provides a certain functionality to be inherited or just reused by a subclass.
- ModuleInit Adds a module initializer to an assembly.
- MrAdvice .NET aspect weaver.
- Mutable Make F# setters for union types and eliminate need for
CLIMutable
attribute for records. - Mvid Adds the ability to specify the assembly MVID (Module Version Id).
- NameOf Provides strongly typed access to a compile-time string representing the name of a variable, field, property, method, event, enum value, or type.
- Nancy.ModelPostprocess Modify Nancy models after route execution but before serialization
- NullGuard Adds null argument checks to an assembly
- Obsolete Helps keep usages of ObsoleteAttribute consistent.
- Padded Adds padding to fight the false sharing problem.
- PropertyChanged Injects INotifyPropertyChanged code into properties.
- PropertyChanging Injects INotifyPropertyChanging code into properties.
- Publicize Converts non-public members to public hidden members.
- QueryValidator Validates your DB queries during a build.
- ReactiveUI Generates ReactiveUI
RaisePropertyChange
notifications for properties andObservableAsPropertyHelper
properties. - RemoveReference Facilitates removing references in a compiled assembly during a build.
- Resourcer Simplifies reading embedded resources from an Assembly.
- RomanticWeb Fody weaver plugin for RomanticWeb instrumentation.
- Scalpel Strips tests from an assembly.
- Seal mark all non-virtual(abstract, non-sealed) types as sealed by default.
- SemVer versions your assemblies according to SemVer based on your CVS commit messages.
- Spring Spring constructor configuration.
- Stamp Stamps an assembly with git data.
- StampSvn Stamps an assembly with svn data.
- StaticProxy Helps proxy dynamic code emitting: Moq, FakeItEasy, Castle Dynamic, LinFu.
- Stiletto Compile-time static analysis and optimization for the Stiletto IoC library.
- SwallowExceptions Swallow Exceptions in targeted methods.
- ToString Generate
ToString
method from public properties. - Tracer Adds trace-enter and trace-leave log entries for selected methods.
- Undisposed Debugging tool to track down undisposed objects.
- Usable Adds using statements for local variables that have been created, and implement IDisposable.
- Validar Injects IDataErrorInfo or INotifyDataErrorInfo code into a class at compile time.
- Vandelay Simplifies MEF importing\exporting.
- Visualize Adds debugger attributes to help visualize objects.
- Virtuosity Change all members to virtual.
- With Methods to return copies of immutable objects with one property modified.
- YALF Yet Another Logging Framework.
- Tail Adds a postfixed method call instruction to recursive calls.
Icon
Bird designed by Marco Hernandez from The Noun Project
More Info
- AddinSearchPaths
- DeployingAddinsAsNugets
- Home
- HowToWriteAnAddin
- InSolutionWeaving
- AssemblyVerification
- ModuleWeaver
- PdbReWritingAndDebugging
- SampleUsage
- Setup
- SignedAssemblies
- SupportedRuntimesAndIde
- TaskAddsAFlagInterface
- TaskCouldNotBeLoaded
- WeavingTaskOptions
- ThrowingAnExceptionFromAnAddin
- Mono Support
- Building From A Network Share
With thanks to
Resharper from Jetbrains
http://www.jetbrains.com/resharper/