4 元数据管理与微调
元数据管理
增加元数据
新版 Natasha 新增了 NatashaLoadContext 操作类来接管编译所需的 [元数据引用] 以及 [Using Code];
首先获取 NatashaLoadContext 实例;
var loadContext = DomainManagement.Random();
//或
var loadContext = (new AssemblyCSharpBuilder().UseRandomDomain()).LoadContext;
从实现程序集中寻找 [元数据引用] 和 [Using Code] 并添加
loadContext.AddReferenceAndUsingCode(myType/myAssembly);
从引用程序集中寻找 [元数据引用] 和 [Using Code] 并添加
loadContext.AddReferenceAndUsingCode(refAssemblyFilePath);
单独增加 [元数据引用]
单独添加 [元数据引用]
loadContext.ReferenceRecorder.AddReference(
AssemblyName assemblyName,
MetadataReference reference,
AssemblyCompareInfomation loadReferenceBehavior)
第三个参数的作用是:当域中已存在 assemblyName 时,用那个版本好。
单独增加 [Using Code]
loadContext.UsingRecorder.Using(string? @using);
loadContext.UsingRecorder.Using(IEnumerable<string> @using);
loadContext.UsingRecorder.Using(Assembly assembly);
loadContext.UsingRecorder.Using(params Assembly[] namespaces);
loadContext.UsingRecorder.Using(IEnumerable<Assembly> namespaces);
loadContext.UsingRecorder.Using(IEnumerable<Type> namespaces);
loadContext.UsingRecorder.Using(Type type);
元数据微调
完整覆盖
合并共享域的 [元数据引用] 和 [Using Code]
builder.WithCombineReferences(item => item.UseAllReferences())
builder.WithCombineUsingCode(UsingLoadBehavior.WithAll)
部分覆盖
合并当前域的 [元数据引用] 和 [Using Code]
builder.WithCurrentReferences()
builder.WithCombineUsingCode(UsingLoadBehavior.WithCurrent)
自定义
不覆盖 [Using Code],使用自己传入的 [元数据引用]
builder.WithSpecifiedReferences(IEnumerable<MetadataReference> metadataReferences)
builder.WithoutCombineUsingCode()