mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
- 实现了CqrsHandlerRegistryGenerator源代码生成器 - 为CQRS处理器减少运行时程序集反射扫描开销 - 支持IRequestHandler、INotificationHandler和IStreamRequestHandler接口 - 提供静态类型引用和运行时反射发现的混合注册策略 - 生成服务注册代码并添加调试日志记录功能 - 实现精确的运行时类型引用描述和泛型类型处理
66 lines
2.7 KiB
C#
66 lines
2.7 KiB
C#
using System.Collections.Immutable;
|
|
using System.IO;
|
|
using Microsoft.CodeAnalysis.CSharp;
|
|
|
|
namespace GFramework.SourceGenerators.Tests.Core;
|
|
|
|
/// <summary>
|
|
/// 为多程序集源生成器测试构建内存元数据引用。
|
|
/// </summary>
|
|
public static class MetadataReferenceTestBuilder
|
|
{
|
|
/// <summary>
|
|
/// 将给定源码编译为内存程序集,并返回可供测试编译消费的元数据引用。
|
|
/// </summary>
|
|
/// <param name="assemblyName">目标程序集名称。</param>
|
|
/// <param name="source">待编译源码。</param>
|
|
/// <param name="additionalReferences">附加元数据引用,用于构造依赖链。</param>
|
|
/// <returns>编译成功后的内存元数据引用。</returns>
|
|
public static MetadataReference CreateFromSource(
|
|
string assemblyName,
|
|
string source,
|
|
params MetadataReference[] additionalReferences)
|
|
{
|
|
var syntaxTree = CSharpSyntaxTree.ParseText(source);
|
|
var references = GetRuntimeMetadataReferences()
|
|
.Concat(additionalReferences)
|
|
.ToImmutableArray();
|
|
var compilation = CSharpCompilation.Create(
|
|
assemblyName,
|
|
[syntaxTree],
|
|
references,
|
|
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
|
|
|
|
using var stream = new MemoryStream();
|
|
var emitResult = compilation.Emit(stream);
|
|
if (!emitResult.Success)
|
|
{
|
|
var diagnostics = string.Join(
|
|
Environment.NewLine,
|
|
emitResult.Diagnostics
|
|
.Where(static diagnostic => diagnostic.Severity == DiagnosticSeverity.Error)
|
|
.Select(static diagnostic => diagnostic.ToString()));
|
|
throw new InvalidOperationException(
|
|
$"Failed to build metadata reference '{assemblyName}'.{Environment.NewLine}{diagnostics}");
|
|
}
|
|
|
|
stream.Position = 0;
|
|
return MetadataReference.CreateFromImage(stream.ToArray());
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前测试运行时可直接复用的基础元数据引用集合。
|
|
/// </summary>
|
|
/// <returns>当前运行时可信平台程序集对应的元数据引用。</returns>
|
|
public static ImmutableArray<MetadataReference> GetRuntimeMetadataReferences()
|
|
{
|
|
var trustedPlatformAssemblies = ((string?)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES"))?
|
|
.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries)
|
|
?? Array.Empty<string>();
|
|
|
|
return trustedPlatformAssemblies
|
|
.Select(static path => (MetadataReference)MetadataReference.CreateFromFile(path))
|
|
.ToImmutableArray();
|
|
}
|
|
}
|