Metalama is a Roslyn-based meta-programming framework for code generation, architecture validation, and aspect-oriented programming in C#.
It lets you write cleaner, more maintainable .NET code by automating repetitive patterns at compile time using aspects, templates, and compile-time logic. It integrates tightly with the Roslyn compiler, providing full control over how your code is built.
- Write and maintain less code: Eliminate boilerplate by generating it dynamically during compilation, reducing code lines and bugs by up to 15%.
- Validate your codebase in real time: Enforce adherence to design rules and conventions without waiting for code reviews.
- Excel with large, complex, or legacy codebases: Metalama shines at scale and does not require architectural changes.
Metalama is ideal for:
- Large projects: Automate repetitive patterns across dozens of entities and hundreds of properties or methods.
- Large teams: Align developers on consistent patterns and practices.
- Long lifecycle projects: Maintain quality over years of development.
It's main use cases are:
- Design Patterns: Singleton, Memento, Factory, Builder, Decorator, Proxy, ...
- UI Patterns: INotifyPropertyChanged, Change Tracking, Memoization, Undo/Redo, Command, Dependency Properties, Enum View-Mode ...
- Object Services: Cloning, ToString, Comparison, ...
- Defensive Programming: Code Contracts (preconditions, post-conditions, invariants)
- DevOps: Logging & Tracing, Metrics, Caching, Exception Handling
- Architecture Validation 💎
- Refactoring
- In general, Clean Code and SOLID & DRY Principles
Metalama is released under the MIT license.
Some optional extensions and IDE tooling are released under a proprietary license. 💎
- Code Generation
- Code Validation
- Immediate Editor Feedback
- Code Fix Toolkit 💎
- Ready-to-Use Aspect Libraries
- Visual Studio Tooling 💎
- Test Frameworks
- Debugging of Transformed Code
- Roslyn Extensibility SDK
- Code Query API
- 🌐 Metalama Website
- 📖 Documentation
- 📝 Annotated Examples
- 📜 Changelogs
- 📢 Release Notes
- ✨ Metalama Tools for Visual Studio Extension
-
Add the
Metalama.Frameworkpackage to your project:dotnet add package Metalama.Framework
-
Optionally, install Metalama Tools for Visual Studio Extension. It's free for individuals, non-commercial uses, and companies with up to 3 users.
-
Explore the Metalama Marketplace for ready-made aspects or examples.
-
Follow the Getting Started guide to create your first aspect.
We welcome contributions! Here's how you can help:
- ⭐ Star the Metalama repository or review us on Visual Studio Marketplace.
- 📝 Write a blog post or record a video about Metalama.
- 📦 Share your aspects on the Metalama Marketplace.
- 🛠️ Contribute to Metalama.Community.
- 📚 Improve the documentation. Learn how.
- 🐛 Fix bugs or contribute code. Learn how.
For more details, see Contributing to Metalama.
- Report issues on GitHub. Follow these recommendations.
- Join GitHub discussions for questions and proposals.
- Enterprise support is available. Learn more about premium support. 💎
Here are the principal repositories that make Metalama:
| Repository | License | Description |
|---|---|---|
| Metalama | MIT | Our main repository containing the full open-source product. |
| Metalama.Compiler | MIT | Our fork of Roslyn adding an extensibility API for source code transformations. |
| PostSharp.Engineering | MIT | A custom multi-repo build and CI framework. |
| Metalama.Community | MIT | Community-contributed aspects repository. |
| Metalama.Documentation | MIT | Source for documentation hosted on Metalama Docs. |
| Metalama.Samples | MIT | Illustrative samples available at Metalama Examples. |
| Metalama.Premium 💎 | Proprietary | Extensions available to customers with a commercial license. |
Below is a list of packages produced from this organization:
| Package Name | License | Description |
|---|---|---|
| Metalama.Framework | MIT | This is Metalama's main and core package. It incorporates a reference to Metalama.Compiler, effectively replacing the Roslyn compiler with our custom version. |
| Metalama.Framework.Redist | MIT | Contains the public API of the Metalama Framework, without Metalama.Compiler. Reference this package to produce your own packages when you don't want them to use the forked compiler. |
| Metalama.Compiler | MIT | A fork of Roslyn that allows add-ins (such as Metalama.Framework) to perform arbitrary code transformations. |
| Metalama.Testing.UnitTesting | MIT | Provides base classes and utilities for unit testing compile-time code. |
| Metalama.Testing.AspectTesting | MIT | A framework based on xUnit for testing code generation by aspects. |
| Metalama.Framework.Redist | MIT | Similar to Metalama.Framework, but excludes the dependency on Metalama.Compiler. |
| Metalama.Framework.Sdk | MIT | Facilitates the use of the Roslyn API from aspects. |
| Metalama.Framework.Engine | MIT | This is the core implementation of Metalama.Framework. Direct referencing of this package is discouraged and unsupported. It's intended to be a dependency for Metalama.Testing.AspectTesting. |
| Metalama.Framework.CompileTimeContracts | MIT | Defines the public API between compiled T# templates and Metalama.Framework.Engine. |
| Metalama.Framework.Introspection | MIT | Provides an API to inspect the object model that represents the compilation process of Metalama.Framework, such as aspect and advice instances, as well as its results. |
| Metalama.Framework.Workspaces | MIT | A supplementary API to Metalama.Framework.Introspection, designed to facilitate the loading of Visual Studio projects and solutions. This package is also useful to inspect projects that don't use Metalama. It is used by Metalama.LinqPad. |
| Metalama.Tool | MIT | The metalama tool for the .NET CLI. |
| Metalama.Extensions.DependencyInjection | MIT | A framework that allows aspects to consume dependencies from an arbitrary dependency injection framework. |
| Metalama.Extensions.Metrics | MIT | Implements code metrics that can be consumed by aspects and fabrics. |
| Metalama.Extensions.Multicast | MIT | Simulates the legacy PostSharp attribute multicasting to ease the migration from PostSharp to Metalama. |
| Metalama.Patterns.Caching | MIT | Comprehensive caching framework for Metalama. |
| Metalama.Patterns.Caching.Aspects | MIT | Aspects designed for Metalama caching, building upon Metalama.Patterns.Caching. |
| Metalama.Patterns.Caching.Backend | MIT | Provides an abstraction over caching backends, including an in-memory caching implementation. |
| Metalama.Patterns.Contracts | MIT | Code contract aspects like [NotNull], [Url] for contract-based programming. |
| Metalama.Patterns.Immutability | MIT | Represents the concept of Immutable Type so that it can be used by other packages like Metalama.Patterns.Observability. |
| Metalama.Patterns.Memoization | MIT | Implements a memoization aspect, i.e. simple and super-fast caching. |
| Metalama.Patterns.Observability | MIT | A Metalama aspect implementing INotifyPropertyChanged. |
| Metalama.Patterns.Wpf | MIT | Aspects that implement WPF dependency properties and commands. |
| Metalama.LinqPad | MIT | Provides integration with LINQPad for inspecting projects and solutions. |
| Flashtrace | MIT | A structured tracing library used by Metalama.Patterns.Caching. |
| Flashtrace.Formatters | MIT | Object formatters used in caching and logging. |
| Metalama.Licensing 💎 | Proprietary | This package verifies that the user or the project has a valid license for Metalama. |
| Metalama.Extensions.CodeFixes 💎 | Proprietary | Enables aspects and fabrics to suggest custom code fixes. |
| Metalama.Extensions.Validation 💎 | Proprietary | Provides a base API for aspects and fabrics to validate source code, including the validation of code references and dependencies. |
| Metalama.Extensions.Architecture 💎 | Proprietary | Extends the Metalama.Extensions.Validation package with a high-level API to validate source code against architecture rules. |
| Metalama.Patterns.Caching.Backends.Redis 💎 | Proprietary | Implements a Metalama.Patterns.Caching adapter for Redis, allowing for distributed caching and hybrid caching. |
| Metalama.Patterns.Caching.Backends.Azure 💎 | Proprietary | Implements cache synchronization for Metalama.Patterns.Caching using Azure Message Bus, allowing to several several local caches in a multi-node deployment. |