<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
  <channel>
    <title>Metalama Blog</title>
    <description>News from the Metalama project.</description>
    <link>https://metalama.net</link>
    <atom:link href="https://metalama.net/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Wed, 13 May 2026 17:05:16 +0000</pubDate>
    <lastBuildDate>Wed, 13 May 2026 17:05:16 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Metalama 2026.0 Generally Available: Full Support for C# 14 and .NET 10</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2026/2026-01-announcement/metalama.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;Metalama 2026.0 is now generally available! This major release brings full support for C# 14—the most significant evolution of the C# language in years—along with .NET 10 SDK and Visual Studio 2026 compatibility. We’re also closing one of the last feature gaps with PostSharp: the ability to override event handler invocations. And you’re getting first-class support for tuple types.&lt;/p&gt;

&lt;p&gt;Ready to try it? The packages are on &lt;a href=&quot;https://www.nuget.org/packages/Metalama.Framework&quot;&gt;NuGet.org&lt;/a&gt;, and the Visual Studio extension is available from the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=PostSharpTechnologies.PostSharp&quot;&gt;Visual Studio Marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the complete list of changes, see the &lt;a href=&quot;https://doc.metalama.net/conceptual/release-notes/release-notes-2026-0&quot;&gt;release notes&lt;/a&gt;. For an even more details, see the change notes for the releases &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.11&quot;&gt;2026.0.11&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.10-rc&quot;&gt;2026.0.10-rc&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.9-rc&quot;&gt;2026.0.9-rc&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.8-rc&quot;&gt;2026.0.8-rc&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.7-rc&quot;&gt;2026.0.7-rc&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.6-rc&quot;&gt;2026.0.6-rc&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.5-preview&quot;&gt;2026.0.5-preview&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.4-preview&quot;&gt;2026.0.4-preview&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.3-preview&quot;&gt;2026.0.3-preview&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.2-preview&quot;&gt;2026.0.2-preview&lt;/a&gt;,
  &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.1-preview&quot;&gt;2026.0.1-preview&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;c-14-support&quot;&gt;C# 14 support&lt;/h2&gt;

&lt;p&gt;C# 14 introduces several language features, and Metalama 2026.0 supports all of them &lt;em&gt;in user code&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Extension blocks (see below)&lt;/li&gt;
  &lt;li&gt;Null-conditional assignments&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;field&lt;/code&gt; keyword in properties&lt;/li&gt;
  &lt;li&gt;Partial constructors and events&lt;/li&gt;
  &lt;li&gt;Compound assignment operators&lt;/li&gt;
  &lt;li&gt;Simple lambda parameters with modifiers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, some features are &lt;strong&gt;not yet supported in aspects&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Null-conditional assignments in templates&lt;/li&gt;
  &lt;li&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;field&lt;/code&gt; keyword in templates&lt;/li&gt;
  &lt;li&gt;Generating run-time code for extension members via invoker interfaces&lt;/li&gt;
  &lt;li&gt;Adding contracts to the receiver parameter of extension blocks&lt;/li&gt;
  &lt;li&gt;Introducing new compound assignment operators&lt;/li&gt;
  &lt;li&gt;Introducing parameters into partial constructors&lt;/li&gt;
  &lt;li&gt;Introducing new extension blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;extension-blocks&quot;&gt;Extension blocks&lt;/h2&gt;

&lt;p&gt;Extension blocks are the headline feature of C# 14, letting you extend any type with new members. Metalama provides comprehensive support:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Extension blocks are modeled via the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IExtensionBlock&lt;/code&gt; interface, which implements &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TypeKind = Extension&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;They appear under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.ExtensionBlocks&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;You can override extension members using the advising API or apply aspects via custom attributes.&lt;/li&gt;
  &lt;li&gt;You can introduce new members into existing extension blocks.&lt;/li&gt;
  &lt;li&gt;Introducing &lt;em&gt;new&lt;/em&gt; extension blocks is not yet supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s how to add logging to all extension methods in your project using a fabric:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Fabric&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ProjectFabric&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;AmendProject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IProjectAmender&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;amender&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;amender&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectTypes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectMany&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExtensionBlocks&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectMany&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Methods&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AddAspectIfEligible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LogAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;event-handler-overriding&quot;&gt;Event handler overriding&lt;/h2&gt;

&lt;p&gt;You can now override event handler invocations, enabling patterns like “safe events” where each handler is isolated by exception handling. The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OverrideInvoke&lt;/code&gt; method in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OverrideEventAspect&lt;/code&gt; intercepts individual handler invocations.&lt;/p&gt;

&lt;p&gt;Typical use cases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Safe events (exception isolation)&lt;/li&gt;
  &lt;li&gt;Background or asynchronous event dispatch&lt;/li&gt;
  &lt;li&gt;Event invocation logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s an aspect that catches exceptions and removes faulty handlers:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SafeEventAttribute&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OverrideEventAspect&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OverrideInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Proceed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Apply it to any event:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Camera&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SafeEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnFocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Empty&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;For details, see &lt;a href=&quot;https://doc.metalama.net/conceptual/aspects/advising/overriding-events&quot;&gt;Overriding events&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;first-class-tuple-support&quot;&gt;First-class tuple support&lt;/h2&gt;

&lt;p&gt;Previously, Metalama treated tuples as plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt; objects—no access to element names or types. The new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITupleType&lt;/code&gt; interface changes that, making scenarios like packing method arguments for interceptors much cleaner:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Create a tuple type from method parameters.&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TypeFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateTupleType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameters&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Create a tuple instance.&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleExpression&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateCreateInstanceExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameters&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Pass it to an observer.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_myObserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;OnMethodCalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeclaringType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FullName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Value&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;metrics-enhancements&quot;&gt;Metrics enhancements&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;LinesOfCode metric&lt;/strong&gt;: Three measurements—Logical, NonBlank, and Total.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Workspaces API&lt;/strong&gt;: Now officially supports metrics consumption.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;visual-studio-tooling-improvements&quot;&gt;Visual Studio tooling improvements&lt;/h2&gt;

&lt;p&gt;We’ve refactored several background components of our VSIX. It’s now more stable, consumes less CPU, and better utilizes your cores.&lt;/p&gt;

&lt;h2 id=&quot;claude-code-skill-for-ai-assisted-development&quot;&gt;Claude Code skill for AI-assisted development&lt;/h2&gt;

&lt;p&gt;We’re introducing a Claude Code skill that gives Anthropic’s AI assistant comprehensive Metalama knowledge:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Conceptual documentation&lt;/li&gt;
  &lt;li&gt;API references&lt;/li&gt;
  &lt;li&gt;Sample code and pattern libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re new to Metalama or tackling a complex scenario, Claude can now provide contextually relevant guidance for aspect development, templates, fabrics, and the code model.&lt;/p&gt;

&lt;p&gt;The skill is available on the &lt;a href=&quot;https://github.com/metalama/Metalama.AI.Skills&quot;&gt;Metalama.AI.Skills marketplace&lt;/a&gt;. For setup instructions, see &lt;a href=&quot;https://doc.metalama.net/conceptual/using/claude-code&quot;&gt;Configuring Claude Code&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;documentation-updates&quot;&gt;Documentation updates&lt;/h2&gt;

&lt;p&gt;We’ve made significant improvements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;New: &lt;a href=&quot;https://doc.metalama.net/conceptual/aspects/type-system&quot;&gt;Working with types&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Improved: &lt;a href=&quot;https://doc.metalama.net/conceptual/aspects/templates&quot;&gt;Writing T# templates&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Updated: &lt;a href=&quot;https://doc.metalama.net/conceptual/aspects/dependency-injection&quot;&gt;Injecting dependencies into aspects&lt;/a&gt; (now covers cross-project DI)&lt;/li&gt;
  &lt;li&gt;Updated: &lt;a href=&quot;https://doc.metalama.net/conceptual/aspects/advising/overriding-events&quot;&gt;Overriding events&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;New: &lt;a href=&quot;https://doc.metalama.net/conceptual/introspection/metrics&quot;&gt;Consuming code metrics&lt;/a&gt; and &lt;a href=&quot;https://doc.metalama.net/conceptual/sdk/custom-metrics&quot;&gt;Custom metrics&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Enhanced API docs with integrated conceptual content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;breaking-changes&quot;&gt;Breaking changes&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;.NET 6 SDK is no longer supported.&lt;/li&gt;
  &lt;li&gt;Several API and behavioral changes. See the &lt;a href=&quot;https://doc.metalama.net/conceptual/release-notes/release-notes-2026-0&quot;&gt;release notes&lt;/a&gt; for details.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s next&lt;/h2&gt;

&lt;p&gt;With 2026.0 shipped, we’ll focus on extending C# 14 support in aspects.&lt;/p&gt;

&lt;p&gt;Found an issue or have a feature request? Let us know on &lt;a href=&quot;https://github.com/metalama/Metalama/issues&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;

&lt;p&gt;-gael&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/metalama-2026-0-ga"&gt;Metalama 2026.0 Generally Available: Full Support for C# 14 and .NET 10&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Mon, 05 Jan 2026 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/metalama-2026-0-ga</link>
        <guid isPermaLink="true">https://metalama.net/blog/metalama-2026-0-ga</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2026/2026-01-announcement/metalama.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama November 2025 Update: Release Candidate for Metalama 2026.0</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-11-status/november-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;Metalama 2026.0 has reached Release Candidate status! All planned features are implemented, our test suite is green, and the release is stable enough for production evaluation. We’re now gathering community feedback ahead of our GA release on January 5th, 2026.&lt;/p&gt;

&lt;p&gt;Ready to try it? The RC packages are available on &lt;a href=&quot;https://www.nuget.org/packages/Metalama.Framework/2026.0.6-rc&quot;&gt;NuGet.org&lt;/a&gt;, and the Visual Studio extension can be downloaded from the &lt;a href=&quot;https://www.postsharp.net/downloads/metalama/metalama-2026.0&quot;&gt;Metalama 2026.0 downloads page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article covers what we shipped this month. For the complete list of changes in Metalama 2026.0, see the &lt;a href=&quot;https://doc.metalama.net/preview/conceptual/release-notes/release-notes-2026-0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the full list of fixes and enhancements, see the changelogs:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.4-preview&quot;&gt;2026.0.4-preview&lt;/a&gt; (November 8).&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.5-preview&quot;&gt;2026.0.5-preview&lt;/a&gt; (November 12).&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.6-rc&quot;&gt;2026.0.6-rc&lt;/a&gt; (November 28).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;c-14-extension-members&quot;&gt;C# 14 Extension Members&lt;/h2&gt;

&lt;p&gt;This month, we completed support for C# 14 extension blocks. You can now advise extension members and introduce members into existing extension blocks.&lt;/p&gt;

&lt;p&gt;Extension blocks are the “extend everything” feature in C# 14. Here’s how Metalama models them:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Extension blocks use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IExtensionBlock&lt;/code&gt; interface, which implements &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt; (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TypeKind = Extension&lt;/code&gt;) so you can discover members the usual &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Fields&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Properties&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Methods&lt;/code&gt;, … collections.&lt;/li&gt;
  &lt;li&gt;They appear under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.ExtensionBlocks&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Extension methods and property accessors are also listed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.Methods&lt;/code&gt; as implicitly-implemented methods.&lt;/li&gt;
  &lt;li&gt;You can override extension members using the advising API or add aspects using custom attributes.&lt;/li&gt;
  &lt;li&gt;You can also add new extension members to existing extension blocks.&lt;/li&gt;
  &lt;li&gt;Introducing new extension blocks won’t be supported in 2026.0.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;other-improvements&quot;&gt;Other Improvements&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Single-file applications.&lt;/strong&gt; Metalama aspects now work in single-file &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;dotnet run&lt;/code&gt; applications: arguably a niche scenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Toast notifications.&lt;/strong&gt; Product briefs and news now appear via toast notifications on Windows. You can disable or configure this feature through the UI or CLI tool.&lt;/p&gt;

&lt;h2 id=&quot;visual-studio-tools-improved-stability-and-performance&quot;&gt;Visual Studio Tools improved stability and performance&lt;/h2&gt;

&lt;p&gt;During the last two weeks, we focused heavily on Visual Studio extension stability — and uncovered more issues than expected.&lt;/p&gt;

&lt;p&gt;We owe you an apology. Most of these bugs were already present in the 2025.1 release, though some may have been introduced by a Visual Studio 17.x minor update (we don’t repeat our full manual test suite after each VS release, so we can’t be certain). We discovered them through exhaustive testing on clean virtual machines as part of our RC validation process.&lt;/p&gt;

&lt;p&gt;This level of testing clearly wasn’t done properly for 2025.1. To ensure quality meets our standards, we chose to delay the release by one month, missing our target to reach GA before the Christmas break. It was the right call.&lt;/p&gt;

&lt;p&gt;The good news: the Visual Studio extension is now significantly more stable, and we achieved impressive performance improvements along the way. You can download it from the &lt;a href=&quot;https://www.postsharp.net/downloads/metalama/metalama-2026.0&quot;&gt;Metalama 2026.0 downloads page&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;known-issues&quot;&gt;Known Issues&lt;/h2&gt;

&lt;p&gt;A couple of items to address before GA:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;There’s a known issue (&lt;a href=&quot;https://github.com/metalama/Metalama.Compiler/issues/149&quot;&gt;#149&lt;/a&gt;) with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;apt&lt;/code&gt; package on Linux. We’re working on a fix.&lt;/li&gt;
  &lt;li&gt;The next RC will update to Roslyn 5.0.0 GA (&lt;a href=&quot;https://github.com/metalama/Metalama/issues/1212&quot;&gt;#1212&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;whats-next&quot;&gt;What’s Next&lt;/h2&gt;

&lt;p&gt;With full .NET 10 SDK and C# 14 support (except for by-design limitations documented in the &lt;a href=&quot;https://doc.metalama.net/preview/conceptual/release-notes/release-notes-2026-0&quot;&gt;release notes&lt;/a&gt;), and a significantly more stable Visual Studio extension, we’re on track for GA on January 5th, 2026.&lt;/p&gt;

&lt;p&gt;If you haven’t tried the RC yet, now is the time. Test it with your projects and let us know what you find—your feedback helps ensure a rock-solid release.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;

&lt;p&gt;-gael&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/status-2025-11"&gt;Metalama November 2025 Update: Release Candidate for Metalama 2026.0&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Sun, 30 Nov 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/status-2025-11</link>
        <guid isPermaLink="true">https://metalama.net/blog/status-2025-11</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-11-status/november-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama October 2025 Update: Full Steam Ahead Toward 2026.0</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-10-status/october-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;October is traditionally our busiest month. Microsoft ships the RCs of the .NET SDK, C# and Visual Studio, and we sprint to make Metalama ready. This year is no exception: we’ve made solid progress, and we’re confident we’ll be ready on time for the GA wave. Below is a recap of what we shipped and what’s coming.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20252-skipped-for-simplicity&quot;&gt;Metalama 2025.2: skipped for simplicity&lt;/h2&gt;

&lt;p&gt;We’ve decided not to ship Metalama 2025.2 as a standalone release. All its features, including the ability to override event handler invocations, are already merged into Metalama 2026.0. Why? The only real benefit of releasing 2025.2 would be making event-invocation advising available a few weeks earlier, but supporting two versions in parallel would slow us down.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20260-almost-there&quot;&gt;Metalama 2026.0: almost there&lt;/h2&gt;

&lt;p&gt;We are now almost code-complete with Metalama 2026.0, and have released several previews:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.3-preview&quot;&gt;2026.0.3-preview changelog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.2-preview&quot;&gt;2026.0.2-preview changelog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2026.0.1-preview&quot;&gt;2026.0.1-preview changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;net-10-sdk-and-c-14&quot;&gt;.NET 10 SDK and C# 14&lt;/h3&gt;

&lt;p&gt;We’re nearly done with support for the .NET 10 SDK and C# 14. Want to see where things stand? Check out these resources:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/orgs/metalama/projects/1/views/2?sliceBy%5Bvalue%5D=2026.0&quot;&gt;General status board&lt;/a&gt; highlighting the leftovers for the 2026.0 version.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/orgs/metalama/projects/1/views/14&quot;&gt;C# 14 status board&lt;/a&gt; showing our progress with C# 14 features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Out of scope for Metalama 2026.0:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Using null-conditional assignments in templates. &lt;a href=&quot;https://github.com/metalama/Metalama/issues/1109&quot;&gt;#1109&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Using the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;field&lt;/code&gt; keyword in templates. &lt;a href=&quot;https://github.com/metalama/Metalama/issues/1114&quot;&gt;#1114&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Introducing new extension blocks. &lt;a href=&quot;https://github.com/metalama/Metalama/issues/1159&quot;&gt;#1159&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;del&gt;Introducing extension members into existing extension blocks. &lt;a href=&quot;https://github.com/metalama/Metalama/issues/1160&quot;&gt;#1160&lt;/a&gt;&lt;/del&gt; UPDATE: implemented in 2026.0.4-preview.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fun fact&lt;/strong&gt;: we noticed that compiling our &lt;a href=&quot;https://github.com/metalama/Metalama.Tests.NopCommerce&quot;&gt;NopCommerce snapshot&lt;/a&gt; with C# 14 breaks LINQ-to-SQL because of implicit conversions of arrays to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ReadOnlySpan&lt;/code&gt;. We’ve had to pin this solution to C# 13 to work around this issue.&lt;/p&gt;

&lt;h3 id=&quot;extension-blocks&quot;&gt;Extension blocks&lt;/h3&gt;

&lt;p&gt;“Extend everything” is the headline feature of C# 14, and we’re making sure Metalama supports it out of the box — including overriding extension members. Here’s how we’re modeling extension blocks:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Extension blocks use the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IExtensionBlock&lt;/code&gt; interface (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TypeKind = Extension&lt;/code&gt;). It derives from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt;, and adds two properties: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ReceiverParameter&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ReceiverType&lt;/code&gt;. Although extension blocks derive from &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt;, you can’t always treat them like regular ones. Yes, this technically bends the Liskov Substitution Principle, but splitting the hierarchy would make the API noisier for little practical benefit. For extension members (except classic extension methods), &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IMember.DeclaringType&lt;/code&gt; points to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IExtensionBlock&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Extension blocks show up under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.ExtensionBlocks&lt;/code&gt;, not as nested types (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.Types&lt;/code&gt;).&lt;/li&gt;
  &lt;li&gt;Extension methods and property accessors are listed in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.Methods&lt;/code&gt; as implicitly-implemented methods. They exist in IL and are addressable in C#, but you can’t override them with Metalama.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach feels natural for C# developers and closely matches Roslyn’s model.&lt;/p&gt;

&lt;h3 id=&quot;first-class-support-for-named-tuples&quot;&gt;First-class support for named tuples&lt;/h3&gt;

&lt;p&gt;Previously, Metalama treated tuples as plain &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType&lt;/code&gt; objects, without access to element types or names. This made scenarios like packing method arguments for interceptors (think caching) awkward and inefficient. Now, with the new &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITupleType&lt;/code&gt; interface, you get direct access to element names and types. Create named tuples with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;TypeFactory.CreateTupleType&lt;/code&gt;, and instantiate them with &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITupleType.CreateCreateInstanceExpression&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Our implementation even supports tuples with zero or one element. For two or more, you get the nice tuple syntax; for degenerate cases, Metalama falls back to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ValueTuple.Create(...)&lt;/code&gt;. When you use &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ITupleType&lt;/code&gt;, you don’t have to worry about these details yourself.&lt;/p&gt;

&lt;p&gt;Example: Want to advise multiple methods and pass all arguments to an observer? Here’s how:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Create the tuple type.&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;TypeFactory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateTupleType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Create the tuple instance.&lt;/span&gt;
&lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleExpression&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;CreateCreateInstanceExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Parameters&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Invoke the interceptor.&lt;/span&gt;
&lt;span class=&quot;n&quot;&gt;_myObserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;OnMethodCalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;DeclaringType&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FullName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;tupleExpression&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Transformed code:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Two or more arguments: tuple syntax&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IEnumerable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Hat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;FindHats&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;decimal&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_myObserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;OnMethodCalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HatStore&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;FindHats&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;category&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// One argument: ValueTuple.Create&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IsHatAvailable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;long&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;hatId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_myObserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;OnMethodCalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HatStore&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;IsHatAvailable&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ValueTuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hatId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Zero arguments&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;bool&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;IsStoreOpen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;_myObserver&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;OnMethodCalled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;HatStore&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;IsStoreOpen&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ValueTuple&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;note&quot;&gt;&lt;strong&gt;Breaking Change:&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INamedType.TypeKind&lt;/code&gt; now returns &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Tuple&lt;/code&gt; instead of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NamedType&lt;/code&gt; for tuples.&lt;/p&gt;

&lt;h3 id=&quot;advising-event-invocations&quot;&gt;Advising event invocations&lt;/h3&gt;

&lt;p&gt;Overriding event handler invocation logic, originally planned for 2025.2, is now part of 2026.0. For details, see the &lt;a href=&quot;https://metalama.net/blog/status-2025-09#metalama-20252-rc-event-invocation-overrides&quot;&gt;September 2025 Status Update&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;other-improvements&quot;&gt;Other improvements&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Introducing user-defined &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;checked&lt;/code&gt; operators.&lt;/li&gt;
  &lt;li&gt;Dependency injection: pull constructor parameters across projects.&lt;/li&gt;
  &lt;li&gt;API cleanup (some breaking changes, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[Obsolete]&lt;/code&gt; warnings).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;metalama-20251-now-supports-visual-studio-2026&quot;&gt;Metalama 2025.1: now supports Visual Studio 2026&lt;/h2&gt;

&lt;p&gt;Last month, we added limited .NET 10 SDK support to Metalama 2025.1. As of October 7, Visual Studio 2026 is also supported.&lt;/p&gt;

&lt;p&gt;Just make sure to update both the NuGet packages and the VSIX extension.&lt;/p&gt;

&lt;h2 id=&quot;roadmap-finalizing-20260&quot;&gt;Roadmap: finalizing 2026.0&lt;/h2&gt;

&lt;p&gt;We’re wrapping up the last features for full C# 14 support in Metalama 2026.0. Next up: stabilization, code cleanup, manual testing, and performance validation.&lt;/p&gt;

&lt;p&gt;We’re aiming for a release candidate (RC) on November 7, barring any surprises during testing. The final GA release will follow soon after Microsoft ships the GA versions of the .NET SDK and related packages.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;In October, we made excellent progress with Metalama 2026.0, whose main focus is to support the .NET 10 SDK, C# 14, and Visual Studio 2026. We’re almost code complete, and we’ll spend most of November stabilizing the release.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;

&lt;p&gt;-gael&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/status-2025-10"&gt;Metalama October 2025 Update: Full Steam Ahead Toward 2026.0&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Thu, 30 Oct 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/status-2025-10</link>
        <guid isPermaLink="true">https://metalama.net/blog/status-2025-10</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-10-status/october-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, September 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-09-status/september-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;Welcome to Metalama’s September 2025 status update. After a relaxed summer, we’re back in full swing, delivering .NET 10 SDK support for Metalama and closing a key gap versus PostSharp: the ability to override event handler invocations.&lt;/p&gt;

&lt;h2 id=&quot;our-first-community-contributor&quot;&gt;Our first community contributor&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2025/2025-09-status/beppemarazzi.jpeg&quot; alt=&quot;Giuseppe Marazzi&quot; class=&quot;portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Let me start with the announcement that brings me the greatest joy.&lt;/p&gt;

&lt;p&gt;This past summer, Metalama received its first contribution from the open-source community. &lt;a href=&quot;https://github.com/beppemarazzi&quot;&gt;Giuseppe Marazzi&lt;/a&gt; submitted &lt;a href=&quot;https://github.com/metalama/Metalama/pulls?q=author%3Abeppemarazzi++is%3Apr&amp;amp;filterScopeGroup=true&quot;&gt;two PRs&lt;/a&gt; fixing two small and hard-to-find bugs.&lt;/p&gt;

&lt;p&gt;A warm thanks to Giuseppe!&lt;/p&gt;

&lt;p&gt;While Metalama may look like a complex codebase at first glance, Giuseppe’s contribution proves that anyone can make a meaningful impact. Don’t let the technical depth intimidate you: every contribution, no matter how small, is valuable and welcome! We’re here to help if you want to get involved! Check out our &lt;a href=&quot;https://metalama.net/contributing&quot;&gt;contributor’s guide&lt;/a&gt; to learn how to get started.&lt;/p&gt;

&lt;h2 id=&quot;net-sdk-10-readiness&quot;&gt;.NET SDK 10 readiness&lt;/h2&gt;

&lt;p&gt;As autumn arrives, Microsoft is finalizing the new .NET stack, and, like all .NET extenders, we’re working hard to make sure you can use the new features as soon as possible.&lt;/p&gt;

&lt;p&gt;We’ve split the work into two releases:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Metalama 2025.1 received quick fixes to keep working with the .NET 10 SDK, with limitations;&lt;/li&gt;
  &lt;li&gt;Metalama 2026.0 will be built natively for the .NET 10 SDK.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;metalama-20251-limited-net-sdk-10-support&quot;&gt;Metalama 2025.1: limited .NET SDK 10 support&lt;/h3&gt;

&lt;p&gt;With the .NET SDK 10 already in RC, we didn’t want you to wait for full integration, so we made small changes to ensure compatibility with the new .NET SDK.&lt;/p&gt;

&lt;p&gt;This build is Metalama 2025.1.14, released this week. From our &lt;a href=&quot;https://github.com/metalama/Metalama.Tests.DotNetSdk/actions/workflows/test.yml&quot;&gt;platform integration matrix tests&lt;/a&gt;, most .NET workloads are working.&lt;/p&gt;

&lt;p&gt;Keep in mind that Metalama 2025.1 is still based on Roslyn 4.14, while the .NET SDK 10 includes Roslyn 5.0. This has some implications:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Analyzers and source generators compiled against Roslyn 5.0 will not work. When possible, we replace them with an older Roslyn 4.14 version—this often works, but not always.&lt;/li&gt;
  &lt;li&gt;Specifically, Blazor projects (all flavors) are not supported yet because of an incompatibility in their source generators.&lt;/li&gt;
  &lt;li&gt;You cannot use C# 14 features in your Metalama projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;metalama-20260-in-progress&quot;&gt;Metalama 2026.0 in progress&lt;/h3&gt;

&lt;p&gt;The goal of Metalama 2026.0 is to bring full native support for the .NET 10 SDK and C# 14 — native, not hacks.&lt;/p&gt;

&lt;p&gt;C# 14 brings a lot of new features, and we won’t support all of them in every scenario in November, when the new .NET is expected to become generally available. Our primary goal with Metalama 2026.0 is to let you safely use any new C# feature in your runtime code—but not necessarily in aspect templates. Support for new language features in templates may come in later versions. This aligns with our design philosophy: Metalama should be able to compile any valid C# code, but it’s okay to limit features available in aspects.&lt;/p&gt;

&lt;p&gt;We’re using GitHub to track our progress. You can use &lt;a href=&quot;https://github.com/metalama/Metalama/issues/1045&quot;&gt;this meta-issue&lt;/a&gt; or &lt;a href=&quot;https://github.com/orgs/metalama/projects/1/views/2?sliceBy%5Bvalue%5D=2026.0&quot;&gt;this dashboard&lt;/a&gt; to check the status.&lt;/p&gt;

&lt;p&gt;We plan to have an RC ready in November, when Microsoft is expected to release the new stack.&lt;/p&gt;

&lt;p&gt;If you’re eager for a preview, look for one next week — or, if you’re more patient, compile the develop/2026.0 branch of &lt;a href=&quot;https://github.com/metalama/Metalama/tree/develop/2026.0&quot;&gt;Metalama&lt;/a&gt; and &lt;a href=&quot;https://github.com/metalama/Metalama.Compiler/tree/develop/2026.0&quot;&gt;Metalama.Compiler&lt;/a&gt; repos (merged from Roslyn tag &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;NET-SDK-10.0.100-preview.7.25380.108&lt;/code&gt; as of today).&lt;/p&gt;

&lt;h2 id=&quot;visual-studio-2026-readiness&quot;&gt;Visual Studio 2026 readiness&lt;/h2&gt;

&lt;p&gt;We ran some initial tests of our Metalama Tools for Visual Studio with Visual Studio 2026—and they failed, subtly but miserably.&lt;/p&gt;

&lt;p&gt;It seems those incompatibilities can be addressed with fairly small bug fixes. If that proves to be true, we’ll update our tooling 2025.1 to support Visual Studio 2026 — and there will be no need to wait for Metalama 2026.0.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20252-rc-event-invocation-overrides&quot;&gt;Metalama 2025.2 RC: Event invocation overrides&lt;/h2&gt;

&lt;p&gt;We have just released the first—and hopefully final—RC of Metalama 2025.2.&lt;/p&gt;

&lt;p&gt;Since the beginning, Metalama has allowed overriding the &lt;em&gt;add&lt;/em&gt; and &lt;em&gt;remove&lt;/em&gt; accessors of events, which were arguably of limited utility. This version adds the ability to override the &lt;em&gt;invocation&lt;/em&gt; of event handlers. The OverrideInvoke method of the OverrideEventAspect class lets you intercept the invocation of an individual event handler.&lt;/p&gt;

&lt;p&gt;Typical use cases are:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;safe events (exception handling)&lt;/li&gt;
  &lt;li&gt;background/asynchronous events&lt;/li&gt;
  &lt;li&gt;event invocation logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s illustrate this with an example. This aspect catches exceptions in event handlers; if any exception is caught, it removes it from the event invocation list.&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SafeEventAttribute&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OverrideEventAspect&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// If there are many event handlers, this method will be called several times.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OverrideInvoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Proceed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// First time shame on you, second time shame on me.&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We can now add this to any event:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Camera&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SafeEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnFocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Empty&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;As you might expect, it took us a while to implement—it’s far from simple.&lt;/p&gt;

&lt;p&gt;Here’s how Metalama transforms your code:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Camera&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// The field backing the event.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_focusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// A broker sitting between the event API and the backing field.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;volatile&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ActionEventBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&amp;gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;_focusChangedBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Binds the broker to the event implementation and the advice.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;readonly&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ActionEventBrokerCallbacks&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChangedBrokerCallbacks_0&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Camera&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;FocusChanged_Invoke_SafeEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Camera&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FocusChanged_SafeEvent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Camera&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;me&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FocusChanged_SafeEvent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;



    &lt;span class=&quot;c1&quot;&gt;// The public event with the new implementation.&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;SafeEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChanged&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;add&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;ActionEventBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&amp;gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;EnsureInitialized&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;ref&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChangedBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChangedBrokerCallbacks_0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChangedBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;AddHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;remove&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChangedBroker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;RemoveHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// The original event implementation.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;event&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;FocusChanged_SafeEvent&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;add&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChanged&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;remove&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChanged&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Your advice intercepting the handler invocation.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;FocusChanged_Invoke_SafeEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EventHandler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sender&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;_focusChanged&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OnFocusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_focusChanged&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Invoke&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EventArgs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Empty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;It’s a bit lengthy, but aside from a touch of syntactic sugar, the event broker is the most reliable pattern, because we can’t predict or analyze how an event is raised. This approach is oblivious to the event’s implementation and to how it gets raised.&lt;/p&gt;

&lt;p&gt;You can find more details on this &lt;a href=&quot;https://doc.metalama.net/preview/conceptual/aspects/advising/overriding-events&quot;&gt;documentation page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Subscribe to our &lt;a href=&quot;/briefs&quot;&gt;briefs&lt;/a&gt; to receive updates about ongoing work on Metalama 2026.0 before the next monthly update.&lt;/p&gt;

&lt;h2 id=&quot;dockerization-of-our-build-infrastructure&quot;&gt;Dockerization of our build infrastructure&lt;/h2&gt;

&lt;p&gt;As a side note, the entire Metalama build infrastructure now runs on Docker, requiring only lean build agents.&lt;/p&gt;

&lt;p&gt;That means you can build Metalama in the exact environment we use.&lt;/p&gt;

&lt;p&gt;All you need is a Windows 11 or Windows Server 2025 machine with Docker installed and Windows containers enabled, then run:&lt;/p&gt;

&lt;div class=&quot;language-powershell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;\DockerBuild.ps1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;build&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;On the feature side, the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OverrideEventAspect.OverrideInvoke&lt;/code&gt; advice closes one of Metalama’s remaining gaps with PostSharp. On the platform front, we’ve released the first bits of .NET 10 support and we expect to deliver more soon. In terms of infrastructure, Dockerizing our build workflow makes Metalama easy to reproduce across agents and helps reduce the cost and complexity of our setup.&lt;/p&gt;

&lt;p&gt;Happy meta-programming with Metalama!&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/status-2025-09"&gt;Metalama Status Update, September 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Wed, 01 Oct 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/status-2025-09</link>
        <guid isPermaLink="true">https://metalama.net/blog/status-2025-09</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-09-status/september-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, Mid Summer 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-08-status/july-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;It’s been over two months since our last status update. After a busy spring that peaked with the open-sourcing of Metalama, summer has been a bit quieter on the development side. Our focus shifted to releasing the source code of both PostSharp and Metalama’s premium packages under a source-available license, while fitting in some vacation time. But don’t worry, the open-source Metalama hasn’t been neglected. We’ve been moving our bug tracker to GitHub, squashing bugs in 2025.1, and tackling one of the last feature gaps between PostSharp and Metalama: the ability to override event invocations.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20251---maintenance&quot;&gt;Metalama 2025.1 - Maintenance&lt;/h2&gt;

&lt;p&gt;Since the last status update, we’ve released three maintenance builds, focusing solely on bug fixes: &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.12&quot;&gt;2025.1.12&lt;/a&gt;, &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.11&quot;&gt;2025.1.11&lt;/a&gt;, and &lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.10&quot;&gt;2025.1.10&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In general, we now consider 2025.1 to be stable.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20252---wip&quot;&gt;Metalama 2025.2 - WIP&lt;/h2&gt;

&lt;p&gt;The focus of Metalama 2025.2 is a single new feature: the ability to &lt;a href=&quot;https://github.com/metalama/Metalama/issues/549&quot;&gt;intercept the &lt;em&gt;invocation&lt;/em&gt; of events&lt;/a&gt;. This addresses one of the last gaps with PostSharp — the main remaining one is the ability to advise the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;await&lt;/code&gt; operator.&lt;/p&gt;

&lt;p&gt;The first preview is planned for late August or early September, with an RC in late September and GA in late October.&lt;/p&gt;

&lt;p&gt;We aim to make it possible to write aspects like this:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;SafeEventAttribute&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OverrideEventAspect&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OverrideEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Proceed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;c1&quot;&gt;// First time shame on you, second time shame on me.&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Event&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Remove&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;handler&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;metalama-20260---roadmap&quot;&gt;Metalama 2026.0 - Roadmap&lt;/h2&gt;

&lt;p&gt;Metalama 2026.0 will add support for .NET 10 and C# 14.&lt;/p&gt;

&lt;p&gt;Our goal this year is to release the GA days after Microsoft’s own GA, expected in mid-November. Previously, our tradition was to release in the early days of the new year, but this time we’ll aim to be ready sooner with platform support, ensuring the release isn’t bogged down with other features.&lt;/p&gt;

&lt;p&gt;We want to enable Metalama users to utilize new C# features in &lt;em&gt;normal&lt;/em&gt; code. However, support for new language features &lt;em&gt;in aspect code&lt;/em&gt;, such as &lt;em&gt;generation&lt;/em&gt; of extension members, will be delayed to another version. This should ensure we’re ready with the GA in November.&lt;/p&gt;

&lt;h2 id=&quot;equality-comparison-sample&quot;&gt;Equality comparison sample&lt;/h2&gt;

&lt;p&gt;We’ve published a new comprehensive example: implementing equality comparison, i.e., &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IEquatable&amp;lt;T&amp;gt;&lt;/code&gt; and its companions. Metalama can now implement the complete pattern.&lt;/p&gt;

&lt;p&gt;The ultimate goal is to be able to write code like this:&lt;/p&gt;

&lt;div class=&quot;language-csharp highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;partial&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Entity&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;StringEqualityMember&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;StringComparison&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;InvariantCultureIgnoreCase&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;required&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;string&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;EntityType&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;EqualityMember&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Id&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ObjectId&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Guid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;NewGuid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Check it out step by step: &lt;a href=&quot;https://doc.metalama.net/examples/comparison&quot;&gt;Equality Comparison Example&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;project-management-on-github&quot;&gt;Project management on GitHub&lt;/h2&gt;

&lt;p&gt;Being open source is not just about making the source code public. It’s also about collaboration and transparency, including in product and project management.&lt;/p&gt;

&lt;p&gt;This summer, we have moved our project management to &lt;a href=&quot;https://github.com/orgs/metalama/projects/1&quot;&gt;a public GitHub project&lt;/a&gt;, and migrated our complete backlog.&lt;/p&gt;

&lt;p&gt;You might be surprised by the &lt;a href=&quot;https://github.com/orgs/metalama/projects/1/views/1?filterQuery=status%3ABacklog%2CPlanned%2C+type%3ABug&quot;&gt;number of bugs&lt;/a&gt; now. Most of them have been discovered internally and never reported by the community. We try to fix community- and customer-reported bugs as soon as possible, but delay internally-discovered bugs until we are done with more important features.&lt;/p&gt;

&lt;h2 id=&quot;source-access-for-proprietary-components&quot;&gt;Source access for proprietary components&lt;/h2&gt;

&lt;p&gt;As you know, Metalama is 85% open-source, with premium components available for enterprise customers who need advanced features and commercial support.&lt;/p&gt;

&lt;p&gt;We’re happy to announce that the source code of premium packages is now available, &lt;a href=&quot;https://blog.postsharp.net/postsharp-source-available&quot;&gt;together with PostSharp’s source code&lt;/a&gt;, to enterprise customers under a relatively permissive proprietary source-available license, allowing you to modify, build, and distribute the software for various purposes. The principal scenarios are troubleshooting, supply chain security, and supply chain resilience.&lt;/p&gt;

&lt;p&gt;Here’s the process:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Sign in to the &lt;a href=&quot;https://www.postsharp.net/account&quot;&gt;customer portal&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Check your support entitlements. You must have an Enterprise support plan (E1 or higher). If you’re a PostSharp customer, you might have it without knowing it.&lt;/li&gt;
  &lt;li&gt;Go to the &lt;a href=&quot;https://www.postsharp.net/account/source-access&quot;&gt;source access&lt;/a&gt; page.&lt;/li&gt;
  &lt;li&gt;Sign the Non-Disclosure/Non-Competing Agreement &lt;a href=&quot;https://app.hellosign.com/s/BNWR7aMh&quot;&gt;online&lt;/a&gt; (or &lt;a href=&quot;https://www.postsharp.net/downloads/legal/Source%20Access%20NDA-NCA.docx&quot;&gt;offline&lt;/a&gt;).&lt;/li&gt;
  &lt;li&gt;Allow for one business day to review the signature and update your account.&lt;/li&gt;
  &lt;li&gt;Return to the &lt;a href=&quot;https://www.postsharp.net/account/source-access&quot;&gt;source access&lt;/a&gt; page and create Git users and passwords.&lt;/li&gt;
  &lt;li&gt;Clone the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Premium&lt;/code&gt; repository using Git.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For details, see &lt;a href=&quot;https://blog.postsharp.net/postsharp-source-available&quot;&gt;PostSharp Is Now Source Available&lt;/a&gt; on PostSharp’s blog.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;Even though summer has been quieter for Metalama, we’ve made significant progress with moving the project management to GitHub, fixing bugs, keeping up with Roslyn, and adding small features. Down the road, the upcoming features in 2025.2 are set to further close the gap with PostSharp, and 2026.0 will be compatible with .NET 10 and C# 14. The new source access policy for enterprise customers also marks a significant step in our journey towards greater transparency.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;P.S. If you’re looking for more frequent updates than our monthly (or less) newsletter provides, we regularly share quick announcements and technical tidbits on &lt;a href=&quot;/briefs&quot;&gt;Metalama Briefs&lt;/a&gt;. Subscribe to this &lt;a href=&quot;/briefs.xml&quot;&gt;RSS feed&lt;/a&gt; with your favorite newsreader, which won’t manipulate your timeline like social media algorithms do.&lt;/p&gt;



          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/status-2025-08"&gt;Metalama Status Update, Mid Summer 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Thu, 07 Aug 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/status-2025-08</link>
        <guid isPermaLink="true">https://metalama.net/blog/status-2025-08</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-08-status/july-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, May 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-05-status/may-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;May is a time of growth and renewal, and Metalama is no exception. At the start of this month, we began a new chapter by open-sourcing our codebase, marking one of the most significant contributions to the .NET community this year. Throughout May, we focused on stabilizing our first open-source release, improving compliance with supply chain security and transparency best practices, and participating in the Open Source Founder Summit in Paris.&lt;/p&gt;

&lt;h2 id=&quot;open-sourcing-metalama&quot;&gt;Open Sourcing Metalama&lt;/h2&gt;

&lt;p&gt;The biggest news this month: we’ve released Metalama 2025.1, our first open-source version!&lt;/p&gt;

&lt;p&gt;This is big news not just for us but for the entire .NET ecosystem. While many open-source projects have announced their commercial transition this year, we’re going against the tide and have released 85% of Metalama’s codebase under the MIT license. We believe that vendor-led open-source projects are the most viable option for development tools, components, and libraries—except for IDEs and UI components, which have an established commercial market. As a result, the entire code generation and aspect-oriented programming feature is now open source, while IDE tooling, architecture verification, and some other extensions remain proprietary.&lt;/p&gt;

&lt;p&gt;Curious about why we made this decision, what it means for you, and what’s next? Dive into the full story in my blog post, &lt;a href=&quot;https://metalama.net/blog/metalama-open-source&quot;&gt;Metalama Is Now Open Source&lt;/a&gt;, and read my thoughts about the delicate balance between community-driven development and commercial sustainability.&lt;/p&gt;

&lt;p&gt;If you haven’t already, please &lt;a href=&quot;https://github.com/metalama/Metalama&quot;&gt;give us a star&lt;/a&gt; on GitHub to show your support!&lt;/p&gt;

&lt;h2 id=&quot;metalama-20251-post-release-updates&quot;&gt;Metalama 2025.1: Post-Release Updates&lt;/h2&gt;

&lt;p&gt;Since the general availability (GA) release of Metalama 2025.1, we’ve been busy listening to your feedback and rolling out fixes and improvements. Thank you to everyone who reported issues and shared suggestions!&lt;/p&gt;

&lt;p&gt;Here’s a quick look at recent releases:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.6&quot;&gt;2025.1.6&lt;/a&gt;: Bug fixes and minor telemetry improvements.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.7&quot;&gt;2025.1.7&lt;/a&gt;: Major update—merged with Roslyn 4.14 for improved compatibility.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.8&quot;&gt;2025.1.8&lt;/a&gt;: Critical licensing bug fix, made &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[Observable]&lt;/code&gt; applicable to interfaces, and further telemetry improvements.&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama/releases/tag/release%2F2025.1.9&quot;&gt;2025.1.9&lt;/a&gt;: Critical Visual Studio Extension (VSX) bug fix.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the full changelog and all release notes, check out the &lt;a href=&quot;https://github.com/metalama/Metalama/releases&quot;&gt;GitHub Releases page&lt;/a&gt;. The Roslyn merge in 2025.1.7 is especially important—it keeps Metalama aligned with the latest C# language features and tooling.&lt;/p&gt;

&lt;h2 id=&quot;open-source-security-foundation-best-practices&quot;&gt;Open Source Security Foundation Best Practices&lt;/h2&gt;

&lt;p&gt;As part of many critical supply chains, we’re taking security and best practices seriously. Our pipelines are now compliant with OpenSSF best practices.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bestpractices.dev/projects/10558&quot;&gt;&lt;img src=&quot;https://www.bestpractices.dev/projects/10558/badge&quot; alt=&quot;OpenSSF Best Practices&quot; /&gt;&lt;/a&gt; 
&lt;a href=&quot;https://scorecard.dev/viewer/?uri=github.com/metalama/Metalama&quot;&gt;&lt;img src=&quot;https://api.scorecard.dev/projects/github.com/metalama/Metalama/badge&quot; alt=&quot;OpenSSF Scorecard&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;open-source-founder-summit-in-paris&quot;&gt;Open Source Founder Summit in Paris&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2025/2025-05-status/osfs.jpeg&quot; alt=&quot;Open Source Founder Summit&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This month, I had the pleasure of attending the &lt;a href=&quot;https://05f5.com/&quot;&gt;Open Source Founder Summit&lt;/a&gt; in Paris. It was inspiring to connect with fellow open-source leaders and dive deep into the realities of open-source business models, governance, and sustainability. I’ve captured my reflections and key takeaways in a dedicated LinkedIn article: &lt;a href=&quot;https://www.linkedin.com/pulse/attending-open-source-founder-summit-paris-gael-fraiteur-ktrvf&quot;&gt;Attending the Open Source Founder Summit in Paris&lt;/a&gt;. I share candid thoughts on open-source foundations, why I believe the .NET open-source community lags behind others, and why I don’t think this will change anytime soon. If you’re curious about my perspective, I invite you to give it a read!&lt;/p&gt;

&lt;h2 id=&quot;closing-the-metalama-community-slack-workspace&quot;&gt;Closing the Metalama Community Slack Workspace&lt;/h2&gt;

&lt;p&gt;As part of our transition to open source, we’ve closed the Metalama community Slack workspace, which previously served as a channel for brief news and technical support.&lt;/p&gt;

&lt;p&gt;Going forward, real-time conversations with our core team on Slack or Teams will be reserved for enterprise customers. For the wider community, we encourage you to use &lt;a href=&quot;https://github.com/orgs/metalama/discussions&quot;&gt;GitHub Discussions&lt;/a&gt; for questions, ideas, and general conversation, or &lt;a href=&quot;https://github.com/metalama/Metalama/issues&quot;&gt;GitHub Issues&lt;/a&gt; for bug reports and feature requests. While we do monitor these channels, please note that our response times may be slower than before.&lt;/p&gt;

&lt;h2 id=&quot;metalama-briefs-stay-tuned&quot;&gt;Metalama Briefs: Stay Tuned&lt;/h2&gt;

&lt;p&gt;To stay informed about the latest news, releases, and quick updates, visit our &lt;a href=&quot;https://metalama.net/briefs&quot;&gt;briefs page&lt;/a&gt; or subscribe to the &lt;a href=&quot;https://metalama.net/briefs.xml&quot;&gt;RSS feed&lt;/a&gt;. This is the most reliable way to receive announcements about new builds and community updates, without worrying about social media algorithms filtering them out of your timeline.&lt;/p&gt;

&lt;h2 id=&quot;roadmap&quot;&gt;Roadmap&lt;/h2&gt;

&lt;p&gt;After a busy and successful spring, we’re looking forward to slowing down during the summer, focusing on filling some remaining gaps between Metalama and PostSharp. In autumn, we plan to work on .NET 10 and C# 14 compatibility.&lt;/p&gt;

&lt;p&gt;We’ve updated the &lt;a href=&quot;/contributing/roadmap&quot;&gt;roadmap&lt;/a&gt; to provide more clarity on upcoming features and releases:&lt;/p&gt;

&lt;h3 id=&quot;june-2025&quot;&gt;June 2025&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Stabilize 2025.1.&lt;/li&gt;
  &lt;li&gt;Migrate the issue database and project management to GitHub.&lt;/li&gt;
  &lt;li&gt;Release PostSharp’s source code under our proprietary source-available license.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;summer-2025&quot;&gt;Summer 2025&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Metalama 2025.2: Filling gaps with PostSharp&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Support for overriding event invocation.&lt;/li&gt;
      &lt;li&gt;If time permits: interception of &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;await&lt;/code&gt; for enhanced asynchronous programming capabilities.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;autumn-2025&quot;&gt;Autumn 2025&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Metalama 2026.0: Compatibility with .NET 10 and C# 14&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Ensuring full support for the latest language features and runtime improvements.&lt;/li&gt;
      &lt;li&gt;Additional enhancements to streamline meta-programming workflows.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Metalama is now open source, and honestly, there’s no excuse left for writing repetitive code in .NET. Open source isn’t just about throwing code over the wall—it’s about embracing transparency, security, and evolving how we do business. We’re still ironing out some details, but we’re committed to building a project that’s strong, reliable, and here to stay.&lt;/p&gt;

&lt;p&gt;Thanks for being part of this journey. Now go write some awesome aspects!&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/status-2025-05"&gt;Metalama Status Update, May 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Fri, 30 May 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/status-2025-05</link>
        <guid isPermaLink="true">https://metalama.net/blog/status-2025-05</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-05-status/may-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Is Now Open Source, Adding Full Meta-Programming to C#</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-05-announcement/april-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;We’re excited to announce that &lt;strong&gt;Metalama&lt;/strong&gt;, the most advanced meta-programming framework for C#, is now open source! Released under the permissive MIT license, Metalama empowers .NET developers with a simple, innovative, and powerful approach to code generation, architecture validation, and aspect-oriented programming.&lt;/p&gt;

&lt;p&gt;Over 85% of the codebase is now open source, with only its IDE tooling and select extension packages remaining proprietary.&lt;/p&gt;

&lt;p&gt;We believe this is a big deal not just for our team, but for the entire .NET ecosystem. Departing from the legacy of IL-based tools, Metalama leverages Roslyn to bring advanced meta-programming capabilities directly to the C# language—while remaining 100% syntax-compatible with C# and all editors.&lt;/p&gt;

&lt;blockquote class=&quot;note&quot;&gt;
  &lt;p&gt;This article is part of a 3-post series announcing the launch of our 2025.1 versions:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Metalama Is Now Open Source – Adding Full Meta-Programming Capabilities to C#&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://blog.postsharp.net/metalama-2025-1&quot;&gt;Announcing Metalama 2025.1&lt;/a&gt;: changes in licensing and support terms for Metalama.&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://blog.postsharp.net//postsharp-2025-1&quot;&gt;Announcing PostSharp 2025.1&lt;/a&gt;: changes in licensing and support terms for PostSharp.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;how-big-is-metalama-a-reality-check&quot;&gt;How Big Is Metalama? A Reality Check&lt;/h2&gt;

&lt;p&gt;Metalama’s open-source release follows nearly five years of dedicated development, resulting in a robust codebase and an (almost) feature-complete product. The core repository includes over &lt;strong&gt;400,000 lines of code&lt;/strong&gt; and spans more than &lt;strong&gt;17,000 commits&lt;/strong&gt;, representing approximately &lt;strong&gt;ten man-years&lt;/strong&gt; (20,000 hours) of work by seasoned .NET compiler experts.&lt;/p&gt;

&lt;p&gt;While Metalama isn’t the largest .NET project—Roslyn or Mono are still larger by an order of magnitude—it is undoubtedly one of the most substantial non-Microsoft projects. For context:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Metalama has more commits than the combined top three .NET Foundation projects over the past five years, according to &lt;a href=&quot;https://dnfprojects.org/&quot;&gt;dnfprojects.org&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Its codebase is roughly twice the combined size of projects like AwesomeAssertions, AutoMapper, and MediatR—three projects that recently transitioned from open source to commercial.&lt;/li&gt;
  &lt;li&gt;It surpasses the combined size of Cecil and Fody, including all its add-ins, by approximately 40%.&lt;/li&gt;
  &lt;li&gt;Metalama is 53% the size of Avalonia, one of the largest .NET vendor-led open-source projects, which counts 750 KLOC.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;what-exactly-is-metalama&quot;&gt;What Exactly Is Metalama?&lt;/h2&gt;

&lt;p&gt;Metalama is like a supercharged code analyzer and generator. Built as a Roslyn-powered extension, it integrates into the C# compilation pipeline and unlocks four key capabilities:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Generate code&lt;/strong&gt; – Add members, implement interfaces, or apply entire design patterns without modifying your source files. If you’re tired of text-based generators, rejoice—Metalama uses a type-safe, object-oriented, C#-to-C# templating system with full IntelliSense support.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Transform code&lt;/strong&gt; – Rewrite method bodies, insert pre/post logic, convert fields to properties, inject dependencies, and more. Unlike Roslyn generators, Metalama is not limited to adding partial classes and can override almost any part of your code.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Validate code&lt;/strong&gt; – Enforce architectural and coding standards at compile time, preventing violations before they reach your repository.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Suggest code fixes and refactorings&lt;/strong&gt; – Surface code generation and transformation via the IDE’s lightbulb or screwdriver menu to guide and assist developers.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;goodbye-fody-&quot;&gt;Goodbye, Fody 👋&lt;/h2&gt;

&lt;p&gt;Unlike legacy IL-weaving tools like Fody, which operate on compiled assemblies, Metalama leverages the Roslyn compiler to apply transformations at the source level. This allows for a level of usability that IL-based tools can’t match:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Immediate IDE feedback&lt;/strong&gt; – Generated members appear in IntelliSense, and diagnostics update live as you type.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Seamless debugging&lt;/strong&gt; – Step into generated code, place breakpoints, and inspect variables exactly as you would in handwritten code. Metalama effectively makes older IL-based code generation tools obsolete.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;No lock-in&lt;/strong&gt; – You can include the generated code back to your source code and remove Metalama from your project thanks to the Metalama Divorce feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;real-world-use-cases-from-design-patterns-to-devops&quot;&gt;Real-World Use Cases: From Design Patterns to DevOps&lt;/h2&gt;

&lt;p&gt;Metalama includes a rich collection of open-source aspect libraries to tackle common software scenarios. Examples include:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Design Patterns&lt;/strong&gt;: &lt;a href=&quot;/applications/modern-singleton&quot;&gt;Singleton&lt;/a&gt;, &lt;a href=&quot;/applications/factory&quot;&gt;Factory&lt;/a&gt;, &lt;a href=&quot;/applications/builder&quot;&gt;Builder&lt;/a&gt;, &lt;a href=&quot;/applications/decorator&quot;&gt;Decorator&lt;/a&gt;, &lt;a href=&quot;/applications/proxy&quot;&gt;Proxy&lt;/a&gt;, and more.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;UI and MVVM Patterns&lt;/strong&gt;: &lt;a href=&quot;/applications/inotifypropertychanged&quot;&gt;Observable&lt;/a&gt; to implement &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;INotifyPropertyChanged&lt;/code&gt;, &lt;a href=&quot;/applications/dependency-property&quot;&gt;dependency properties&lt;/a&gt;, &lt;a href=&quot;/applications/command&quot;&gt;commands&lt;/a&gt;, undo/redo.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Object Services&lt;/strong&gt;: Auto-generated &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ToString&lt;/code&gt;, deep cloning, equality, and comparison.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;DevOps&lt;/strong&gt;: &lt;a href=&quot;/applications/logging&quot;&gt;Logging and tracing&lt;/a&gt;, &lt;a href=&quot;https://metalama.net/applications/metrics&quot;&gt;metrics&lt;/a&gt;, &lt;a href=&quot;https://metalama.net/applications/caching&quot;&gt;caching&lt;/a&gt;, &lt;a href=&quot;https://metalama.net/applications/exception-handling&quot;&gt;retry/fault-handling logic&lt;/a&gt;, and more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;how-metalama-works&quot;&gt;How Metalama Works&lt;/h2&gt;

&lt;p&gt;Meta-programming in Metalama is based on two types of &lt;em&gt;meta-classes&lt;/em&gt; that execute during compilation:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Aspects&lt;/strong&gt; encapsulate reusable code generation and transformation patterns, such as logging, observability, or the Memento design pattern. They act as intelligent attributes that can generate, transform, or validate code in place.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Fabrics&lt;/strong&gt; serve as centralized compile-time entry points, allowing you to apply aspects in bulk across your codebase using a LINQ-style API—eliminating the need to annotate every element manually.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Metalama dynamically rewrites the syntax tree during compilation. Your source code remains clean and focused, while the compiled assembly includes all the generated logic.&lt;/p&gt;

&lt;h3 id=&quot;aspect&quot;&gt;Aspect&lt;/h3&gt;

&lt;p&gt;Here is a classic “hello, world” example: a logging aspect.&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Metalama.Framework.Aspects&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LogAttribute&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;OverrideMethodAspect&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;dynamic&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;OverrideMethod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; started.&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Proceed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; succeeded.&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;$&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt; failed: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.&quot;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;OverrideMethod&lt;/code&gt; is a &lt;em&gt;template&lt;/em&gt;. Parts of the code to the left of the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta&lt;/code&gt; pseudo-keyword are evaluated at compile time. The rest is runtime code. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meta.Proceed()&lt;/code&gt; invokes the overridden method (it is replaced by the original method body in this case).&lt;/p&gt;

&lt;p&gt;You can now apply the aspect to a method as a custom attribute:&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Calculator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;This transforms the code into the following:&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;using&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;System&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;internal&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Calculator&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;Add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Calculator.Add(double, double) started.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Calculator.Add(double, double) succeeded.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;double&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exception&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;n&quot;&gt;Console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;WriteLine&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;$&quot;Calculator.Add(double, double) failed: &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;fabric&quot;&gt;Fabric&lt;/h3&gt;

&lt;p&gt;If you want to log thousands of methods, it would not be practical to annotate every single method with the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[Log]&lt;/code&gt; attribute. That’s why we invented the concept of a &lt;em&gt;fabric&lt;/em&gt;, a compile-time entry point to your project that lets you add any aspect to anything using LINQ-like code.&lt;/p&gt;

&lt;p&gt;The following code snippet adds logging to all public methods of all public types:&lt;/p&gt;

&lt;div class=&quot;language-c# highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Fabric&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;ProjectFabric&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;override&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;AmendProject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;IProjectAmender&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;amender&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;n&quot;&gt;amender&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectTypes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Accessibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Accessibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;SelectMany&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Methods&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;Where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;m&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Accessibility&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;Accessibility&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Public&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;AddAspectIfEligible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;LogAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;&amp;gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;why-vendor-led-open-source-matters&quot;&gt;Why Vendor-Led Open Source Matters&lt;/h2&gt;

&lt;p&gt;We believe vendor-led open source is the new standard for serious software frameworks and libraries. Microsoft’s stewardship of the .NET platform has set the tone: today’s developers expect both &lt;strong&gt;transparency&lt;/strong&gt; and &lt;strong&gt;dependability&lt;/strong&gt; from the tools they choose.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Transparency&lt;/strong&gt;, because developers need to understand how their tools work. They want to debug, diagnose, audit for security. Open source makes that possible by default.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Dependability&lt;/strong&gt; means knowing the project will be maintained, bugs fixed, platforms supported, features added. That kind of long-term commitment requires a sustainable business model, often backed by a profitable company with real skin in the game.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a vendor fails to maintain a project, the open-source license gives the community the power to take over. It lowers the barrier for competitors to step in and raises the pressure on the original maintainer to stay sharp. That’s why open source has become the default model, and why it gets so much visibility.&lt;/p&gt;

&lt;p&gt;Let’s be honest: that visibility is a big reason for our choice. We could have &lt;em&gt;faked&lt;/em&gt; open source, published a hollow core and kept the real value behind closed doors. But here’s what we’re doing instead: we’re releasing 85% of the codebase, a full-featured product. That’s because we’re committed to transparency and dependability, the two core values of vendor-led open-source.&lt;/p&gt;

&lt;p&gt;Our goal is broad adoption.Reducing any licensing friction gets the framework into more hands, and some of those teams will turn into customers. Under PostSharp’s freemium model, about 30% of users are paying customers. With Metalama, we expect that number to be much lower. And we’re fine with that! With a larger distribution, we can afford a lower rate of monetization.&lt;/p&gt;

&lt;p&gt;We’ve also seen what happens when unfunded open-source projects succeed too well: tools like AutoMapper, MediatR, and FluentAssertions eventually had to move to commercial models to survive in the long term. That’s not a failure of open source: it’s a failure of sustainability. They only got big because they were open. On the flip side, we’ve seen technically inferior tools outpace PostSharp just because they were open source. We’re not making that mistake again.&lt;/p&gt;

&lt;p&gt;We’re realistic about community contributions. Metalama is a large, complex codebase. We don’t expect a wave of unsolicited PRs, but we welcome contributions that meet our standards, and we’d love to be proven wrong. See the &lt;strong&gt;How You Can Contribute&lt;/strong&gt; section below.&lt;/p&gt;

&lt;p&gt;Most importantly, this is a return to our roots. PostSharp was open source from 2004 to 2009, and that openness was key to its early success.  With Metalama, we’re bringing that spirit back—stronger, smarter, and built for today.&lt;/p&gt;

&lt;h2 id=&quot;proprietary-components-and-editions&quot;&gt;Proprietary Components and Editions&lt;/h2&gt;

&lt;p&gt;Although Metalama’s compiler integration and core libraries are fully open source, we’ve retained a few advanced components under a commercial license to ensure long-term sustainability:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Visual Studio Extensions&lt;/strong&gt;: The full-featured IDE experience is provided in Metalama Community and Metalama Professional.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Architecture Validation&lt;/strong&gt;: Advanced architectural rules and analysis (formerly under &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Framework.Validation&lt;/code&gt; and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Extensions.Architecture&lt;/code&gt;).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Code Fix Toolkits&lt;/strong&gt;: Custom refactoring and quick-fix support (previously &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Framework.CodeFixes&lt;/code&gt;).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Distributed Caching Adapters&lt;/strong&gt;: Redis and Azure integrations for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Patterns.Caching&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These premium packages will be bundled in &lt;strong&gt;Metalama Professional&lt;/strong&gt;, available under commercial terms.&lt;/p&gt;

&lt;p&gt;We acknowledge that the proprietary status of these components may seem at odds with the open-source value of transparency. To address this, the source code for these proprietary components is available to enterprise customers under a permissive but proprietary license. This ensures that enterprise users can audit, understand, and even customize these components while maintaining the sustainability of the project.&lt;/p&gt;

&lt;h2 id=&quot;free-ide-tooling-for-individuals-and-small-teams&quot;&gt;Free IDE Tooling for Individuals and Small Teams&lt;/h2&gt;

&lt;p&gt;While Metalama’s compiler integration and core framework are fully open source, our &lt;a href=&quot;/features/tooling&quot;&gt;Visual Studio tooling&lt;/a&gt; remains proprietary. These tools aren’t required to use Metalama, but they do offer a significant productivity boost:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Aspect Diff&lt;/strong&gt; – Compare original and transformed code using Visual Studio’s diff viewer.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;CodeLens Integration&lt;/strong&gt; – Instantly see which aspects affect your code, right from the editor.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Aspect Explorer&lt;/strong&gt; – Browse your project to discover where and how aspects are applied.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We initially planned to monetize this tooling across the board. But we don’t want to charge freelancers, students, hobbyists, or open-source maintainers. We want to monetize Metalama only where it makes sense: within large, well-funded organizations.&lt;/p&gt;

&lt;p&gt;That’s why we’re making Visual Studio Tools for Metalama &lt;strong&gt;free for individuals, non-commercial use, and companies with up to 3 developers&lt;/strong&gt;. No license key required. Just indicate your eligibility and you’re good to go. We trust you.&lt;/p&gt;

&lt;p&gt;With this move, everyone, including indie developers to small startups, can access a complete, modern meta-programming experience with first-class IDE support.&lt;/p&gt;

&lt;h2 id=&quot;is-this-project-really-sustainable&quot;&gt;Is This Project Really Sustainable??&lt;/h2&gt;

&lt;p&gt;We understand the concern: how can such a large and ambitious open-source project remain viable over time? The answer is simple: we’re building this on the solid financial and operational ground of a company founded in 2009.&lt;/p&gt;

&lt;p&gt;Metalama was fully funded through the profits of PostSharp. We’ve taken no outside investment and carry no debt. With Metalama now feature-complete, ongoing development primarily involves maintenance and incremental improvements—something that can be managed by a small, focused team. Our company has scaled down accordingly and is already operating profitably, independent of future Metalama revenues.&lt;/p&gt;

&lt;p&gt;Long term, sustainability will come from a dual business model:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Premium features&lt;/strong&gt;: As mentioned above, while the core is fully open source, some components will remain proprietary and available under commercial terms.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Premium support and consulting&lt;/strong&gt;: For teams that want guidance, custom tooling, long-term maintenance, or guaranteed SLAs, we offer paid services.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures that we will be able to create enough value for professional teams to justify commercial investment, while keeping Metalama free and open for the community.&lt;/p&gt;

&lt;p&gt;In short, Metalama is already sustainable in the near term. For the long term, everything hinges on adoption. The broader the user base, the stronger the community—and the more viable the commercial offerings. That’s why we’ve open-sourced the core: to make it easy for everyone to try, trust, and build on Metalama.&lt;/p&gt;

&lt;h2 id=&quot;community-and-enterprise-support&quot;&gt;Community and Enterprise Support&lt;/h2&gt;

&lt;p&gt;We offer a support model tailored to meet the diverse needs of our users:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Community Support&lt;/strong&gt;: The open-source core is self-supported through the GitHub Discussions forum. Community members are encouraged to ask questions, share best practices, and assist one another. Our team will monitor community activities weekly to provide guidance where needed, with no guarantees.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Basic Professional Support&lt;/strong&gt;: Subscribers of Metalama Professional gain access to basic email support for private tickets.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Enterprise Support&lt;/strong&gt;: For organizations needing high-touch support, Metalama Enterprise offers priority assistance, escalation, video consultations, advanced diagnostics, and consultancy services. This plan is designed for teams with critical projects that demand a higher level of engagement and expertise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Details about support offerings, response times, and SLA commitments can be found at &lt;a href=&quot;https://www.postsharp.net/support/policies&quot;&gt;https://www.postsharp.net/support/policies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Only the current version (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YYYY.N&lt;/code&gt;) will be maintained under open-source terms. Previous versions (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;YYYY.N-1&lt;/code&gt;) will be supported exclusively under the enterprise license for customers with long-term support agreements.&lt;/p&gt;

&lt;h2 id=&quot;how-you-can-contribute&quot;&gt;How You Can Contribute&lt;/h2&gt;

&lt;p&gt;Whether you’re just discovering Metalama or already using it in your projects, there are many meaningful ways to get involved:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;⭐ &lt;strong&gt;Star the GitHub repository&lt;/strong&gt;: Show your support and help improve Metalama’s visibility by starring &lt;a href=&quot;https://github.com/metalama/Metalama&quot;&gt;github.com/metalama/Metalama&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;📣 &lt;strong&gt;Spread the word&lt;/strong&gt;: Metalama is a mature, production-ready framework, but adoption is still growing. Share it with your colleagues, present it at meetups, or write a blog post to help raise awareness.&lt;/li&gt;
  &lt;li&gt;🧭 &lt;strong&gt;Help newcomers&lt;/strong&gt;: If you’re familiar with Metalama, consider following issues and discussions on GitHub. Answering questions or clarifying concepts strengthens the community and helps others get started.&lt;/li&gt;
  &lt;li&gt;💡 &lt;strong&gt;Share your feedback and feature requests&lt;/strong&gt;: Your insights are invaluable. Let us know what works, what doesn’t, and what features you’d like to see in future releases.&lt;/li&gt;
  &lt;li&gt;🧩 &lt;strong&gt;Contribute your aspects&lt;/strong&gt;: If you’ve built reusable aspects, consider sharing them with the community. You can:
    &lt;ul&gt;
      &lt;li&gt;Publish them under your own GitHub account and let us know so we can reference them on the &lt;a href=&quot;/marketplace&quot;&gt;Metalama Marketplace&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;Contribute them to the &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Metalama.Community&lt;/code&gt; repository.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;🛠️ &lt;strong&gt;Contribute to the core&lt;/strong&gt;: Bug fixes, small enhancements, and documentation improvements are always welcome. We’ll soon migrate our internal backlog to GitHub, giving you better visibility into what’s needed and how you can help.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For more details, visit &lt;a href=&quot;https://metalama.net/contributing&quot;&gt;https://metalama.net/contributing&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;whats-next-for-metalama&quot;&gt;What’s Next for Metalama&lt;/h2&gt;

&lt;p&gt;Open-sourcing Metalama is a major step, but we’re not stopping here. Here’s what’s coming up next in the short term:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;May 2025&lt;/strong&gt; – We’re migrating our internal issue tracker to GitHub. This will give you full visibility into what we’re working on and let you report bugs, track features, and contribute more easily.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Summer 2025&lt;/strong&gt; – We’re working on extending Metalama’s capabilities to support code transformations on C# &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;event&lt;/code&gt; accessors and &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;await&lt;/code&gt; expressions. This unlocks new possibilities for cross-cutting concerns in asynchronous and event-driven codebases.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Autumn 2025&lt;/strong&gt; – Full support for .NET 10 and the next version of C#. As always, we’ll stay aligned with the latest evolution of the .NET platform.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re committed to improving the framework and responding to community needs. Even though Metalama is now open source, we’re not handing it off and walking away. We’re staying fully engaged, with two full-time engineers (myself and Daniel) dedicated to the project.&lt;/p&gt;

&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Many developers, upon discovering Metalama, have said, &lt;strong&gt;“This should be a standard part of .NET!”&lt;/strong&gt; By open-sourcing Metalama, we’ve done what we could to make that vision a reality.&lt;/p&gt;

&lt;p&gt;Whether you’re a solo developer looking to eliminate boilerplate or part of a team enforcing architecture across a large codebase, Metalama is here to help.&lt;/p&gt;

&lt;p&gt;If you’re excited about the potential of meta-programming in C#, now is the perfect time to get started:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Visit the website at &lt;a href=&quot;https://metalama.net&quot;&gt;metalama.net&lt;/a&gt; and explore &lt;a href=&quot;https://metalama.net/applications&quot;&gt;use cases&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Read the &lt;a href=&quot;https://doc.metalama.net&quot;&gt;documentation&lt;/a&gt;, expecially &lt;a href=&quot;https://doc.metalama.net/examples&quot;&gt;commented examples&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Explore &lt;a href=&quot;/marketplace&quot;&gt;Metalama Marketplace&lt;/a&gt; and find ready-made aspects and examples. Don’t reinvent the wheel!&lt;/li&gt;
  &lt;li&gt;Study the source code on &lt;a href=&quot;https://github.com/metalama/Metalama&quot;&gt;GitHub&lt;/a&gt; and see how it works.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’ve laid the foundation, but the real momentum will come from the community. Together, we can push the boundaries of what C# can achieve.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;

&lt;p&gt;Gael&lt;/p&gt;



          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/metalama-open-source"&gt;Metalama Is Now Open Source, Adding Full Meta-Programming to C#&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Fri, 04 Apr 2025 07:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/metalama-open-source</link>
        <guid isPermaLink="true">https://metalama.net/blog/metalama-open-source</guid>
        
        <category>featured</category>
        
        
        <category>Metalama</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-05-announcement/april-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, March 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-03-status/march-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;This month, we released a preview of Metalama 2025.1, marking a significant milestone as the first open-source version of Metalama. Our efforts to complete the open-source transition will continue in April.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20251-open-source-preview&quot;&gt;Metalama 2025.1: open-source preview&lt;/h2&gt;

&lt;p&gt;Earlier this year, we shared our &lt;a href=&quot;/metalama-open-source-plans&quot;&gt;plans to make Metalama open-source&lt;/a&gt;. Since then, we’ve been working hard to bring this vision to life. In March, we released the first preview of Metalama 2025.1, with most components now licensed under MIT. This is a major step toward transitioning Metalama to an open-core business model.&lt;/p&gt;

&lt;h3 id=&quot;whats-left-to-do&quot;&gt;What’s left to do&lt;/h3&gt;

&lt;p&gt;While we’re excited to share this progress with the Metalama community, this isn’t the big announcement yet. There’s still work to be done:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Fixing some bugs&lt;/li&gt;
  &lt;li&gt;Testing on VMs and physical devices&lt;/li&gt;
  &lt;li&gt;Launching a new website&lt;/li&gt;
  &lt;li&gt;Updating documentation and README files&lt;/li&gt;
  &lt;li&gt;Migrating the issue tracker to GitHub&lt;/li&gt;
  &lt;li&gt;Aligning sales pages and processes with the new offering&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;licensing-notes&quot;&gt;Licensing notes&lt;/h3&gt;

&lt;p&gt;At this stage, licenses for the new business model are not yet available for purchase.&lt;/p&gt;

&lt;p&gt;Existing Metalama commercial licenses remain compatible with the commercial parts of Metalama 2025.1. However, Metalama Free is not compatible. To use Visual Studio Tools for Metalama, you’ll need either a Metalama license key or to activate Metalama Community. Metalama Community is available for non-commercial users, individuals, companies with up to three users, and contributors to open-source projects.&lt;/p&gt;

&lt;h3 id=&quot;resources-to-get-started&quot;&gt;Resources to get started&lt;/h3&gt;

&lt;p&gt;Here’s how you can explore Metalama 2025.1 today:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/metalama/Metalama&quot;&gt;Source code on GitHub&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.nuget.org/packages/Metalama.Framework/2025.1.1-preview&quot;&gt;Packages on NuGet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.postsharp.net/downloads/metalama/metalama-2025.1/v2025.1.1-preview/PostSharpMetalama.2025.1.1-preview.vsix&quot;&gt;Visual Studio Tooling&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;end-of-support-for-metalama-20242&quot;&gt;End of support for Metalama 2024.2&lt;/h2&gt;

&lt;p&gt;As per our &lt;a href=&quot;https://www.postsharp.net/support/policies&quot;&gt;support policies&lt;/a&gt;, support for Metalama 2024.2 has ended. The only supported version now is Metalama 2025.0.&lt;/p&gt;

&lt;h2 id=&quot;metalama-20250-maintenance-builds&quot;&gt;Metalama 2025.0 maintenance builds&lt;/h2&gt;

&lt;p&gt;We’ve released several maintenance builds for Metalama 2025.0 (&lt;a href=&quot;https://github.com/orgs/metalama/discussions/395&quot;&gt;2025.0.9&lt;/a&gt; and &lt;a href=&quot;https://github.com/orgs/metalama/discussions/400&quot;&gt;2025.0.10&lt;/a&gt;), addressing bugs and integrating the latest stable Roslyn build.&lt;/p&gt;

&lt;h2 id=&quot;updated-roadmap&quot;&gt;Updated roadmap&lt;/h2&gt;

&lt;p&gt;Our focus in April is to finalize the open-source transition. Here’s the updated timeline:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;First week of April:&lt;/strong&gt; Release Candidate (RC)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Late April or Early May:&lt;/strong&gt; General Availability (GA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for your continued support. Happy meta-programming!&lt;/p&gt;

&lt;p&gt;-gael&lt;/p&gt;


          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/metalama-status-update-2025-03"&gt;Metalama Status Update, March 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Mon, 31 Mar 2025 08:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/metalama-status-update-2025-03</link>
        <guid isPermaLink="true">https://metalama.net/blog/metalama-status-update-2025-03</guid>
        
        
        <category>Status Update</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-03-status/march-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, February 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-02-status/february-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;Last month, we shared our exciting &lt;a href=&quot;/metalama-open-source-plans&quot;&gt;plans to make Metalama open-source&lt;/a&gt;, and throughout February, we’ve been hard at work making it happen. While we’ve made significant technical progress, we’re not quite ready to release just yet.&lt;/p&gt;

&lt;p&gt;On the technical side, we’ve successfully modularized key features in preparation for the transition, allowing us to keep some components proprietary. However, the legal aspects of dual-licensing Metalama are still in progress. It’s a complex process, and we want to ensure everything is done right from the start. This is the main factor delaying the release of our source code and binaries.&lt;/p&gt;

&lt;h3 id=&quot;updated-roadmap&quot;&gt;Updated Roadmap&lt;/h3&gt;

&lt;p&gt;Here’s our revised timeline for the open-source release:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;First half of March:&lt;/strong&gt; First open-source preview release&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Second half of March:&lt;/strong&gt; Release Candidate (RC)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Second half of April:&lt;/strong&gt; General Availability (GA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the legal process takes longer than expected, we’ll use the extra time to introduce a new feature in the 2025.1 release: &lt;strong&gt;intercepting event invocations&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Between the RC and GA releases, our focus will shift toward supporting infrastructure, including:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Launching a dedicated Metalama website&lt;/li&gt;
  &lt;li&gt;Migrating project and issue management to GitHub&lt;/li&gt;
  &lt;li&gt;Updating our e-shop and CRM systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;stay-tuned&quot;&gt;Stay Tuned!&lt;/h3&gt;

&lt;p&gt;We’re committed to making this transition smooth and impactful. Thank you for your patience and enthusiasm — we’re almost there! Keep an eye out for our updates.&lt;/p&gt;



          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/metalama-status-update-2025-02"&gt;Metalama Status Update, February 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Thu, 27 Feb 2025 08:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/metalama-status-update-2025-02</link>
        <guid isPermaLink="true">https://metalama.net/blog/metalama-status-update-2025-02</guid>
        
        
        <category>Status Update</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-02-status/february-dark.svg</url>
          
        </image>
      </item>
    
      <item>
        <title>Metalama Status Update, January 2025</title>
        <description>
           
          &lt;img src="https://metalama.net/assets/images/2025/2025-01-status/january-dark.svg" style="width: 100%"/&gt;
          
          &lt;p&gt;As we returned from the winter break, we hit the ground running by launching &lt;strong&gt;Metalama and PostSharp 2025.0&lt;/strong&gt;. But that wasn’t all—after careful consideration and experimentation, we’re thrilled to share some groundbreaking news: &lt;strong&gt;Metalama is going open-source&lt;/strong&gt;!&lt;/p&gt;

&lt;h2 id=&quot;metalama-and-postsharp-20250-are-generally-available&quot;&gt;Metalama and PostSharp 2025.0 are generally available&lt;/h2&gt;

&lt;p&gt;Following the release of Metalama and PostSharp 2025.0 Release Candidate (RC) in November, we dedicated much of December to squashing bugs. With Metalama maturing steadily, we’ve started addressing long-term, low-priority issues from our backlog.&lt;/p&gt;

&lt;p&gt;Our first major milestone of the year was deploying &lt;strong&gt;PostSharp and Metalama 2025.0&lt;/strong&gt; on January 4th. Here’s what’s new:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Metalama 2025.0&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Adds support for &lt;strong&gt;C# 13&lt;/strong&gt; and &lt;strong&gt;.NET 9&lt;/strong&gt;.&lt;/li&gt;
      &lt;li&gt;Introduces significant enhancements to the aspect framework.&lt;/li&gt;
      &lt;li&gt;Delivers substantial performance improvements.&lt;br /&gt;
Check out the &lt;a href=&quot;/blog/metalama-2025-0-ga&quot;&gt;Metalama 2025.0 announcement&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;PostSharp 2025.0&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Adds support for &lt;strong&gt;C# 13&lt;/strong&gt;, &lt;strong&gt;.NET 9&lt;/strong&gt;, and long paths in projects targeting &lt;strong&gt;.NET Framework&lt;/strong&gt;.&lt;/li&gt;
      &lt;li&gt;Improves runtime performance for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;WeakEventHandler&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Enhances the debugging experience with &lt;strong&gt;Windows PDB files&lt;/strong&gt;.&lt;br /&gt;
Learn more in the &lt;a href=&quot;/blog/postsharp-2025-0-ga&quot;&gt;PostSharp 2025.0 announcement&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;metalama-20251-going-open-source&quot;&gt;&lt;strong&gt;Metalama 2025.1: going open-source&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Earlier this week, we announced that &lt;a href=&quot;/blog/metalama-open-source-plans&quot;&gt;Metalama 2025.1 will be free and open-source&lt;/a&gt;. To ensure the project’s sustainability, we’ll offer commercial IDE tooling, extensions, and support. We fully commit to a cooperative development process, moving everything to GitHub. Metalama will get a dedicated website and GitHub organization, marking its evolution into an independent, community-driven project separate from PostSharp Technologies.&lt;/p&gt;

&lt;p&gt;Visit the &lt;a href=&quot;/blog/metalama-open-source-plans&quot;&gt;announcement&lt;/a&gt; to learn more about:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;What will be free and open-source, and what won’t?&lt;/li&gt;
  &lt;li&gt;Our new commercial offerings.&lt;/li&gt;
  &lt;li&gt;Our updated policies for long-term support.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your input is invaluable as we implement these changes, so don’t hesitate to share your thoughts while the plans are still being developed.&lt;/p&gt;

&lt;h2 id=&quot;godot--metalama---by-philip-rotter&quot;&gt;&lt;strong&gt;Godot + Metalama = ♡, by Philip Rotter&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/2025/2025-01-godot/filip.jpg&quot; alt=&quot;Philip Rotter&quot; class=&quot;portrait&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Godot, the incredibly efficient open-source game engine, has gained popularity among developers. While many prefer using C# over GDScript due to its rich ecosystem, exporting C# properties to Godot often involves tedious boilerplate code.&lt;/p&gt;

&lt;p&gt;In his latest guest post, &lt;a href=&quot;/blog/metalama-with-godot&quot;&gt;Enhancing Godot Development with Metalama&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/philip-rotter-588a53259/&quot;&gt;Philip Rotter&lt;/a&gt; demonstrates how Metalama can streamline this process. By leveraging Metalama, Philip eliminates redundant code and makes C# development with Godot both fun and efficient — all through a simple, straightforward aspect.&lt;/p&gt;

&lt;p&gt;Thank you very much to Philip for this insightful contribution! It will be an invaluable resource for Godot users looking to explore Metalama for the first time.&lt;/p&gt;

&lt;h2 id=&quot;looking-ahead&quot;&gt;&lt;strong&gt;Looking ahead&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;With Metalama’s transition to open-source, 2025 is shaping to be an exciting year! We’re committed to empowering developers with cutting-edge tools to remove code repetition, built together in a collaborative community. Stay tuned for more updates, and don’t forget to share your feedback on &lt;a href=&quot;https://www.postsharp.net/&quot;&gt;Slack&lt;/a&gt; or &lt;a href=&quot;https://github.com/orgs/metalama/discussions/388&quot;&gt;GitHub&lt;/a&gt; as we continue to evolve and innovate.&lt;/p&gt;

&lt;p&gt;Happy meta-programming!&lt;/p&gt;



          &lt;p&gt;
            This article was first published on a &lt;a href="https://metalama.net/blog"&gt;https://metalama.net/blog&lt;/a&gt;
            under the title &lt;a href="https://metalama.net/blog/metalama-status-update-2025-01"&gt;Metalama Status Update, January 2025&lt;/a&gt;.
          &lt;/p&gt;
        </description>
        <pubDate>Fri, 31 Jan 2025 08:00:01 +0000</pubDate>
        
        <link>https://metalama.net/blog/metalama-status-update-2025-01</link>
        <guid isPermaLink="true">https://metalama.net/blog/metalama-status-update-2025-01</guid>
        
        
        <category>Status Update</category>
        
        <image>
          
          <url>https://metalama.net/assets/images/2025/2025-01-status/january-dark.svg</url>
          
        </image>
      </item>
    
  </channel>
</rss>
