public void AddReference(Assembly assembly, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None) { if (!assembly.IsDynamic && !string.IsNullOrEmpty(assembly.Location)) { AddReference(assembly.GetName(), MetadataReference.CreateFromFile(assembly.Location), loadReferenceBehavior); } }
public IEnumerable <PortableExecutableReference> GetReferences(LoadBehaviorEnum loadBehavior = LoadBehaviorEnum.None, Func <AssemblyName, AssemblyName, LoadVersionResultEnum>?useAssemblyNameFunc = null) { if (Name == DefaultDomain.Name) { return(References.GetReferences()); } else { return(References.CombineWithDefaultReferences(DefaultDomain.References, loadBehavior, useAssemblyNameFunc)); } }
public void SetAssemblyLoadBehavior(LoadBehaviorEnum loadBehavior) { _assemblyLoadBehavior = loadBehavior; }
/// <summary> /// 根据 loadBehavior 参数比较两个程序集版本 /// </summary> /// <param name="beforeName">前一个程序集名</param> /// <param name="afterName">后一个程序集名</param> /// <param name="loadBehavior">加载行为</param> /// <returns></returns> public static LoadVersionResultEnum CompareWithDefault(this AssemblyName customaryName, AssemblyName defaultName, LoadBehaviorEnum loadBehavior) { if (loadBehavior == LoadBehaviorEnum.None) { return(LoadVersionResultEnum.NoAction); } else if (loadBehavior == LoadBehaviorEnum.UseDefault) { return(LoadVersionResultEnum.UseDefault); } else if (loadBehavior == LoadBehaviorEnum.UseCustom) { return(LoadVersionResultEnum.UseCustomer); } else if (customaryName.Version != default && defaultName.Version != default) { if (loadBehavior == LoadBehaviorEnum.UseHighVersion) { if (customaryName.Version > defaultName.Version) { return(LoadVersionResultEnum.UseCustomer); } } else if (loadBehavior == LoadBehaviorEnum.UseLowVersion) { if (customaryName.Version < defaultName.Version) { return(LoadVersionResultEnum.UseCustomer); } } return(LoadVersionResultEnum.UseDefault); } return(LoadVersionResultEnum.NoAction); }
internal HashSet <PortableExecutableReference> CombineWithDefaultReferences(NatashaReferenceCache defaultCache, LoadBehaviorEnum loadBehavior = LoadBehaviorEnum.None, Func <AssemblyName, AssemblyName, LoadVersionResultEnum>?useAssemblyNameFunc = null) { var sets = new HashSet <PortableExecutableReference>(_referenceCache.Values); var excludeNods = new HashSet <PortableExecutableReference>(); var defaultReferences = defaultCache._referenceCache; var defaultNameReferences = defaultCache._referenceNameCache;; if (loadBehavior != LoadBehaviorEnum.None || useAssemblyNameFunc != null) { foreach (var item in _referenceNameCache) { if (defaultNameReferences.TryGetValue(item.Key, out var defaultAssemblyName)) { LoadVersionResultEnum funcResult; if (useAssemblyNameFunc != null) { funcResult = useAssemblyNameFunc(defaultAssemblyName, item.Value); if (funcResult == LoadVersionResultEnum.PassToNextHandler) { funcResult = item.Value.CompareWithDefault(defaultAssemblyName, loadBehavior); } } else { funcResult = item.Value.CompareWithDefault(defaultAssemblyName, loadBehavior); } if (funcResult == LoadVersionResultEnum.UseDefault) { excludeNods.Add(_referenceCache[item.Value]); } else if (funcResult == LoadVersionResultEnum.UseCustomer) { excludeNods.Add(defaultReferences[defaultAssemblyName]); } } } } sets.UnionWith(defaultReferences.Values); sets.ExceptWith(excludeNods); return(sets); }
public void AddReference(AssemblyName assemblyName, string path, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None) { AddReference(assemblyName, MetadataReference.CreateFromFile(path), loadReferenceBehavior); }
public void AddReference(AssemblyName assemblyName, Stream stream, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None) { AddReference(assemblyName, MetadataReference.CreateFromStream(stream), loadReferenceBehavior); }
private void AddReference(AssemblyName assemblyName, PortableExecutableReference reference, LoadBehaviorEnum loadReferenceBehavior) { var name = assemblyName.GetUniqueName(); if (loadReferenceBehavior != LoadBehaviorEnum.None) { if (_referenceNameCache.TryGetValue(name, out var oldAssemblyName)) { if (assemblyName.CompareWithDefault(oldAssemblyName, loadReferenceBehavior) == LoadVersionResultEnum.UseCustomer) { _referenceCache !.Remove(oldAssemblyName); } else { return; } } } _referenceNameCache[name] = assemblyName; _referenceCache[assemblyName] = reference; }
public AssemblyCSharpBuilder CompileWithAssemblyLoadBehavior(LoadBehaviorEnum loadBehavior) { _compileAssemblyBehavior = loadBehavior; return(this); }
public AssemblyCSharpBuilder CompileWithReferenceLoadBehavior(LoadBehaviorEnum loadBehavior) { _compileReferenceBehavior = loadBehavior; return(this); }