Example #1
0
 public void AddReference(Assembly assembly, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None)
 {
     if (!assembly.IsDynamic && !string.IsNullOrEmpty(assembly.Location))
     {
         AddReference(assembly.GetName(), MetadataReference.CreateFromFile(assembly.Location), loadReferenceBehavior);
     }
 }
Example #2
0
 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));
     }
 }
Example #3
0
 public void SetAssemblyLoadBehavior(LoadBehaviorEnum loadBehavior)
 {
     _assemblyLoadBehavior = loadBehavior;
 }
Example #4
0
 /// <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);
 }
Example #5
0
        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);
        }
Example #6
0
 public void AddReference(AssemblyName assemblyName, string path, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None)
 {
     AddReference(assemblyName, MetadataReference.CreateFromFile(path), loadReferenceBehavior);
 }
Example #7
0
 public void AddReference(AssemblyName assemblyName, Stream stream, LoadBehaviorEnum loadReferenceBehavior = LoadBehaviorEnum.None)
 {
     AddReference(assemblyName, MetadataReference.CreateFromStream(stream), loadReferenceBehavior);
 }
Example #8
0
        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;
        }
Example #9
0
 public AssemblyCSharpBuilder CompileWithAssemblyLoadBehavior(LoadBehaviorEnum loadBehavior)
 {
     _compileAssemblyBehavior = loadBehavior;
     return(this);
 }
Example #10
0
 public AssemblyCSharpBuilder CompileWithReferenceLoadBehavior(LoadBehaviorEnum loadBehavior)
 {
     _compileReferenceBehavior = loadBehavior;
     return(this);
 }