diff --git a/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md b/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md
new file mode 100644
index 00000000..f50bb1fe
--- /dev/null
+++ b/src/AspectCore.SourceGenerator/AnalyzerReleases.Shipped.md
@@ -0,0 +1,2 @@
+; Shipped analyzer releases
+; https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md
diff --git a/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md b/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md
new file mode 100644
index 00000000..cbee49a0
--- /dev/null
+++ b/src/AspectCore.SourceGenerator/AnalyzerReleases.Unshipped.md
@@ -0,0 +1,19 @@
+; Unshipped analyzer release
+; https://github.com/dotnet/roslyn-analyzers/blob/main/src/Microsoft.CodeAnalysis.Analyzers/ReleaseTrackingAnalyzers.Help.md
+
+### New Rules
+
+Rule ID | Category | Severity | Notes
+--------|----------|----------|-------
+ACSG001 | AspectCore.SourceGenerator | Warning | Open generic type is not supported for proxy generation.
+ACSG002 | AspectCore.SourceGenerator | Warning | Nested type is not supported for proxy generation.
+ACSG003 | AspectCore.SourceGenerator | Warning | Event member is not supported for proxy generation.
+ACSG004 | AspectCore.SourceGenerator | Warning | Open generic method is not supported for proxy generation.
+ACSG005 | AspectCore.SourceGenerator | Error | Cannot generate a proxy for a sealed type.
+ACSG006 | AspectCore.SourceGenerator | Error | Type is not accessible to the source generator.
+ACSG007 | AspectCore.SourceGenerator | Error | Type has no accessible constructor for a class proxy.
+ACSG008 | AspectCore.SourceGenerator | Error | Cannot generate a proxy for a ref struct type.
+ACSG009 | AspectCore.SourceGenerator | Warning | byref-like params parameter is not supported for proxy generation.
+ACSG010 | AspectCore.SourceGenerator | Warning | byref-like parameter is not supported for proxy generation.
+ACSG011 | AspectCore.SourceGenerator | Warning | byref-like return value is not supported for proxy generation.
+ACSG0101 | AspectCore.SourceGenerator | Warning | Open generic method falls back to reflection for NativeAOT.
diff --git a/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj b/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj
index 22f34451..3fbad0e2 100644
--- a/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj
+++ b/src/AspectCore.SourceGenerator/AspectCore.SourceGenerator.csproj
@@ -31,5 +31,10 @@
+
+
+
+
+
diff --git a/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs b/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs
index 795d17d6..9df28d95 100644
--- a/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs
+++ b/tests/AspectCore.Core.Tests/DependencyInjection/IssueFixTests.cs
@@ -96,7 +96,7 @@ public void Issue331_ResolveFromServiceResolver_AfterExtraRegistration_StillRetu
#region Issue #271: Singleton concurrent construction returns same instance
[Fact]
- public void Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance()
+ public async Task Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance()
{
// Arrange: a singleton service with a slow constructor
var context = new ServiceContext();
@@ -126,7 +126,7 @@ public void Issue271_Singleton_ConcurrentResolution_ReturnsSameInstance()
results[index] = resolver.Resolve(typeof(ISlowSingletonService));
});
}
- Task.WaitAll(tasks);
+ await Task.WhenAll(tasks);
// Assert: all threads should get the same instance
var firstResult = results[0];
diff --git a/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs b/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs
index c410e91e..dd277d2a 100644
--- a/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs
+++ b/tests/AspectCore.Extensions.CastleCompat.Tests/AspectContextInvocationAdapterTests.cs
@@ -242,7 +242,7 @@ public void Proxy_Returns_Context_Proxy()
}
[Fact]
- public void ReturnValue_Get_Returns_Context_ReturnValue()
+ public async Task ReturnValue_Get_Returns_Context_ReturnValue()
{
var context = CreateRealAspectContext(out _);
// The context has ReturnValue=30 from the backing invocation
@@ -255,13 +255,13 @@ public void ReturnValue_Get_Returns_Context_ReturnValue()
// Don't proceed - just read ReturnValue
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
Assert.Equal(30, captured.ReturnValue);
}
[Fact]
- public void ReturnValue_Set_Updates_Context_ReturnValue()
+ public async Task ReturnValue_Set_Updates_Context_ReturnValue()
{
var context = CreateRealAspectContext(out _);
AspectDelegate next = ctx => Task.CompletedTask;
@@ -273,7 +273,7 @@ public void ReturnValue_Set_Updates_Context_ReturnValue()
inv.ReturnValue = 99;
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
Assert.Equal(99, context.ReturnValue);
}
@@ -387,7 +387,7 @@ public void Proceed_Calls_Next_Delegate()
}
[Fact]
- public void Proceed_Called_Twice_Throws_InvalidOperationException()
+ public async Task Proceed_Called_Twice_Throws_InvalidOperationException()
{
var context = CreateRealAspectContext(out _);
AspectDelegate next = ctx => Task.CompletedTask;
@@ -398,11 +398,11 @@ public void Proceed_Called_Twice_Throws_InvalidOperationException()
Assert.Throws(() => inv.Proceed());
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
}
[Fact]
- public void Proceed_Synchronous_Faulted_Task_Propagates_Exception()
+ public async Task Proceed_Synchronous_Faulted_Task_Propagates_Exception()
{
var context = CreateRealAspectContext(out _);
AspectDelegate next = _ => Task.FromException(new InvalidOperationException("test error"));
@@ -412,7 +412,7 @@ public void Proceed_Synchronous_Faulted_Task_Propagates_Exception()
Assert.Throws(() => inv.Proceed());
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
}
[Fact]
@@ -456,7 +456,7 @@ public void CastleInterceptorAdapter_No_AsyncResult_Returns_CompletedTask()
// ── CaptureProceedInfo Tests ────────────────────────────────────────
[Fact]
- public void CaptureProceedInfo_Invoke_Calls_Proceed()
+ public async Task CaptureProceedInfo_Invoke_Calls_Proceed()
{
var context = CreateRealAspectContext(out _);
var nextCalled = false;
@@ -472,13 +472,13 @@ public void CaptureProceedInfo_Invoke_Calls_Proceed()
info.Invoke();
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
Assert.True(nextCalled);
}
[Fact]
- public void CaptureProceedInfo_Double_Invoke_Throws()
+ public async Task CaptureProceedInfo_Double_Invoke_Throws()
{
var context = CreateRealAspectContext(out _);
AspectDelegate next = ctx => Task.CompletedTask;
@@ -490,7 +490,7 @@ public void CaptureProceedInfo_Double_Invoke_Throws()
Assert.Throws(() => info.Invoke());
});
var adapter = new CastleInterceptorAdapter(castleInterceptor);
- adapter.Invoke(context, next).GetAwaiter().GetResult();
+ await adapter.Invoke(context, next);
}
// ── CastleInterceptorAdapter Constructor Tests ──────────────────────