Beispiel #1
0
 /// <summary>
 /// Creates a copy of the current instance.
 /// </summary>
 /// <returns>The copied <see cref="AtataAttributesContext"/> instance.</returns>
 public AtataAttributesContext Clone()
 {
     return(new AtataAttributesContext(
                new List <Attribute>(Global),
                AssemblyMap.ToDictionary(x => x.Key, x => x.Value.ToList()),
                ComponentMap.ToDictionary(x => x.Key, x => x.Value.ToList()),
                PropertyMap.ToDictionary(x => x.Key, x => x.Value.ToList())));
 }
        private Unit LinkForeignModule(Unit self, Reference mod)
        {
            var dll = string.Equals(mod.DllName, "std", StringComparison.OrdinalIgnoreCase) ? "Dyalect.Library" : mod.DllName;

            if (!FindModuleExact(self.FileName, dll + ".dll", mod, out var path))
            {
                return(null);
            }

            if (!AssemblyMap.TryGetValue(path, out Dictionary <string, Type> dict))
            {
                dict = LoadAssembly(path, mod);
            }

            if (dict != null)
            {
                if (!dict.TryGetValue(mod.ModuleName, out Type sysType))
                {
                    AddError(LinkerError.AssemblyModuleNotFound, mod.SourceFileName, mod.SourceLocation,
                             mod.ModuleName, mod.DllName);
                    return(null);
                }

                object module;

                try
                {
                    module = Activator.CreateInstance(sysType);
                }
                catch (Exception ex)
                {
                    AddError(LinkerError.AssemblyModuleLoadError, mod.SourceFileName, mod.SourceLocation,
                             mod.ModuleName, mod.DllName, ex.Message);
                    return(null);
                }

                if (!(module is Unit unit))
                {
                    AddError(LinkerError.InvalidAssemblyModule, mod.SourceFileName, mod.SourceLocation,
                             mod.ModuleName, mod.DllName);
                    return(null);
                }

                unit.FileName = path;
                return(unit);
            }

            return(null);
        }
        private Dictionary <string, Type> LoadAssembly(string path, Reference mod)
        {
            Assembly asm;

            try
            {
                asm = Assembly.LoadFrom(path);
            }
            catch (Exception ex)
            {
                AddError(LinkerError.UnableLoadAssembly, mod.SourceFileName, mod.SourceLocation,
                         mod.DllName, ex.Message);
                return(null);
            }

            var dict = new Dictionary <string, Type>();

            foreach (var t in asm.GetTypes())
            {
                if (Attribute.GetCustomAttribute(t, typeof(DyUnitAttribute)) is DyUnitAttribute attr)
                {
                    if (dict.ContainsKey(attr.Name))
                    {
                        AddError(LinkerError.DuplicateModuleName, mod.SourceFileName, mod.SourceLocation,
                                 mod.DllName, attr.Name);
                    }
                    else
                    {
                        dict.Add(attr.Name, t);
                    }
                }
            }

            AssemblyMap.Add(path, dict);
            return(dict);
        }
    private Dictionary <string, ForeignUnit>?LookupAssembly(Unit self, string dll, Reference? @ref = null)
    {
        if (!AssemblyMap.TryGetValue(dll, out var dict))
        {
            if (!Lookup.Find(Path.GetDirectoryName(self.FileName), dll, out var path))
            {
                return(null);
            }

            dict = LoadAssembly(path, @ref ?? Reference.Empty);

            if (dict is not null)
            {
                AssemblyMap.Add(dll, dict);
            }

            if (dll == DYALECTLIB)
            {
                dyalectLib = dict;
            }
        }

        return(dict);
    }
 private void GetOutputAssemblies(PublishInfo[] publishInfos, ref List<ITaskItem> assemblyList)
 {
     AssemblyMap map = new AssemblyMap();
     if (this.managedAssemblies != null)
     {
         foreach (ITaskItem item in this.managedAssemblies)
         {
             if (!IsFiltered(item))
             {
                 item.SetMetadata("AssemblyType", "Managed");
                 map.Add(item);
             }
         }
     }
     if (this.nativeAssemblies != null)
     {
         foreach (ITaskItem item2 in this.nativeAssemblies)
         {
             if (!IsFiltered(item2))
             {
                 item2.SetMetadata("AssemblyType", "Native");
                 map.Add(item2);
             }
         }
     }
     foreach (PublishInfo info in publishInfos)
     {
         MapEntry entry = map[info.key];
         if (entry != null)
         {
             entry.publishInfo = info;
         }
         else
         {
             base.Log.LogWarningWithCodeFromResources("ResolveManifestFiles.PublishFileNotFound", new object[] { info.key });
         }
     }
     foreach (MapEntry entry2 in (IEnumerable) map)
     {
         if (entry2.publishInfo == null)
         {
             entry2.publishInfo = new PublishInfo();
         }
         if (entry2.publishInfo.state == PublishState.Auto)
         {
             string metadata = entry2.item.GetMetadata("DependencyType");
             if (string.Equals(metadata, "Prerequisite", StringComparison.Ordinal))
             {
                 entry2.publishInfo.state = PublishState.Prerequisite;
             }
             else if (string.Equals(metadata, "Install", StringComparison.Ordinal))
             {
                 entry2.publishInfo.state = PublishState.Include;
             }
         }
         bool itemCopyLocal = GetItemCopyLocal(entry2.item);
         PublishFlags assemblyFlags = PublishFlags.GetAssemblyFlags(entry2.publishInfo.state, itemCopyLocal);
         if ((assemblyFlags.IsPublished && string.Equals(entry2.publishInfo.includeHash, "false", StringComparison.OrdinalIgnoreCase)) && this.SigningManifests)
         {
             this.canPublish = false;
         }
         if (assemblyFlags.IsPublished)
         {
             assemblyList.Add(CreateAssemblyItem(entry2.item, entry2.publishInfo.group, entry2.publishInfo.targetPath, entry2.publishInfo.includeHash));
         }
         else if (assemblyFlags.IsPrerequisite)
         {
             assemblyList.Add(CreatePrerequisiteItem(entry2.item));
         }
     }
 }
Beispiel #6
0
        private void GetOutputAssemblies(PublishInfo[] publishInfos, ref List <ITaskItem> assemblyList)
        {
            AssemblyMap assemblyMap = new AssemblyMap();

            // Add all managed assemblies to the AssemblyMap, except assemblies that are part of the .NET Framework...
            if (_managedAssemblies != null)
            {
                foreach (ITaskItem item in _managedAssemblies)
                {
                    if (!IsFiltered(item))
                    {
                        item.SetMetadata("AssemblyType", "Managed");
                        assemblyMap.Add(item);
                    }
                }
            }

            if (_nativeAssemblies != null)
            {
                foreach (ITaskItem item in _nativeAssemblies)
                {
                    if (!IsFiltered(item))
                    {
                        item.SetMetadata("AssemblyType", "Native");
                        assemblyMap.Add(item);
                    }
                }
            }

            // Apply PublishInfo state from PublishFile items...
            foreach (PublishInfo publishInfo in publishInfos)
            {
                MapEntry entry = assemblyMap[publishInfo.key];
                if (entry != null)
                {
                    entry.publishInfo = publishInfo;
                }
                else
                {
                    Log.LogWarningWithCodeFromResources("ResolveManifestFiles.PublishFileNotFound", publishInfo.key);
                }
            }

            // Go through the AssemblyMap and determine which items get added to ouput AssemblyList based
            // on computed PublishFlags for each item...
            foreach (MapEntry entry in assemblyMap)
            {
                // If PublishInfo didn't come from a PublishFile item, then construct PublishInfo from the item
                if (entry.publishInfo == null)
                {
                    entry.publishInfo = new PublishInfo();
                }

                // If state is auto then also need to look on the item to see whether the dependency type
                // has alread been specified upstream (i.e. from ResolveNativeReference task)...
                if (entry.publishInfo.state == PublishState.Auto)
                {
                    string dependencyType = entry.item.GetMetadata("DependencyType");
                    if (String.Equals(dependencyType, "Prerequisite", StringComparison.Ordinal))
                    {
                        entry.publishInfo.state = PublishState.Prerequisite;
                    }
                    else if (String.Equals(dependencyType, "Install", StringComparison.Ordinal))
                    {
                        entry.publishInfo.state = PublishState.Include;
                    }
                }

                bool         copyLocal = GetItemCopyLocal(entry.item);
                PublishFlags flags     = PublishFlags.GetAssemblyFlags(entry.publishInfo.state, copyLocal);

                if (flags.IsPublished &&
                    string.Equals(entry.publishInfo.includeHash, "false", StringComparison.OrdinalIgnoreCase) &&
                    SigningManifests == true)
                {
                    _canPublish = false;
                }

                if (flags.IsPublished)
                {
                    assemblyList.Add(CreateAssemblyItem(entry.item, entry.publishInfo.group, entry.publishInfo.targetPath, entry.publishInfo.includeHash));
                }
                else if (flags.IsPrerequisite)
                {
                    assemblyList.Add(CreatePrerequisiteItem(entry.item));
                }
            }
        }
        private void GetOutputAssemblies(PublishInfo[] publishInfos, ref List<ITaskItem> assemblyList)
        {
            AssemblyMap assemblyMap = new AssemblyMap();

            // Add all managed assemblies to the AssemblyMap, except assemblies that are part of the .NET Framework...
            if (_managedAssemblies != null)
                foreach (ITaskItem item in _managedAssemblies)
                    if (!IsFiltered(item))
                    {
                        item.SetMetadata("AssemblyType", "Managed");
                        assemblyMap.Add(item);
                    }

            if (_nativeAssemblies != null)
                foreach (ITaskItem item in _nativeAssemblies)
                    if (!IsFiltered(item))
                    {
                        item.SetMetadata("AssemblyType", "Native");
                        assemblyMap.Add(item);
                    }

            // Apply PublishInfo state from PublishFile items...
            foreach (PublishInfo publishInfo in publishInfos)
            {
                MapEntry entry = assemblyMap[publishInfo.key];
                if (entry != null)
                    entry.publishInfo = publishInfo;
                else
                    Log.LogWarningWithCodeFromResources("ResolveManifestFiles.PublishFileNotFound", publishInfo.key);
            }

            // Go through the AssemblyMap and determine which items get added to ouput AssemblyList based
            // on computed PublishFlags for each item...
            foreach (MapEntry entry in assemblyMap)
            {
                // If PublishInfo didn't come from a PublishFile item, then construct PublishInfo from the item
                if (entry.publishInfo == null)
                    entry.publishInfo = new PublishInfo();

                // If state is auto then also need to look on the item to see whether the dependency type
                // has alread been specified upstream (i.e. from ResolveNativeReference task)...
                if (entry.publishInfo.state == PublishState.Auto)
                {
                    string dependencyType = entry.item.GetMetadata("DependencyType");
                    if (String.Equals(dependencyType, "Prerequisite", StringComparison.Ordinal))
                        entry.publishInfo.state = PublishState.Prerequisite;
                    else if (String.Equals(dependencyType, "Install", StringComparison.Ordinal))
                        entry.publishInfo.state = PublishState.Include;
                }

                bool copyLocal = GetItemCopyLocal(entry.item);
                PublishFlags flags = PublishFlags.GetAssemblyFlags(entry.publishInfo.state, copyLocal);

                if (flags.IsPublished &&
                    string.Equals(entry.publishInfo.includeHash, "false", StringComparison.OrdinalIgnoreCase) &&
                    SigningManifests == true)
                    _canPublish = false;

                if (flags.IsPublished)
                    assemblyList.Add(CreateAssemblyItem(entry.item, entry.publishInfo.group, entry.publishInfo.targetPath, entry.publishInfo.includeHash));
                else if (flags.IsPrerequisite)
                    assemblyList.Add(CreatePrerequisiteItem(entry.item));
            }
        }
        private void GetOutputAssemblies(PublishInfo[] publishInfos, ref List <ITaskItem> assemblyList)
        {
            AssemblyMap map = new AssemblyMap();

            if (this.managedAssemblies != null)
            {
                foreach (ITaskItem item in this.managedAssemblies)
                {
                    if (!IsFiltered(item))
                    {
                        item.SetMetadata("AssemblyType", "Managed");
                        map.Add(item);
                    }
                }
            }
            if (this.nativeAssemblies != null)
            {
                foreach (ITaskItem item2 in this.nativeAssemblies)
                {
                    if (!IsFiltered(item2))
                    {
                        item2.SetMetadata("AssemblyType", "Native");
                        map.Add(item2);
                    }
                }
            }
            foreach (PublishInfo info in publishInfos)
            {
                MapEntry entry = map[info.key];
                if (entry != null)
                {
                    entry.publishInfo = info;
                }
                else
                {
                    base.Log.LogWarningWithCodeFromResources("ResolveManifestFiles.PublishFileNotFound", new object[] { info.key });
                }
            }
            foreach (MapEntry entry2 in (IEnumerable)map)
            {
                if (entry2.publishInfo == null)
                {
                    entry2.publishInfo = new PublishInfo();
                }
                if (entry2.publishInfo.state == PublishState.Auto)
                {
                    string metadata = entry2.item.GetMetadata("DependencyType");
                    if (string.Equals(metadata, "Prerequisite", StringComparison.Ordinal))
                    {
                        entry2.publishInfo.state = PublishState.Prerequisite;
                    }
                    else if (string.Equals(metadata, "Install", StringComparison.Ordinal))
                    {
                        entry2.publishInfo.state = PublishState.Include;
                    }
                }
                bool         itemCopyLocal = GetItemCopyLocal(entry2.item);
                PublishFlags assemblyFlags = PublishFlags.GetAssemblyFlags(entry2.publishInfo.state, itemCopyLocal);
                if ((assemblyFlags.IsPublished && string.Equals(entry2.publishInfo.includeHash, "false", StringComparison.OrdinalIgnoreCase)) && this.SigningManifests)
                {
                    this.canPublish = false;
                }
                if (assemblyFlags.IsPublished)
                {
                    assemblyList.Add(CreateAssemblyItem(entry2.item, entry2.publishInfo.group, entry2.publishInfo.targetPath, entry2.publishInfo.includeHash));
                }
                else if (assemblyFlags.IsPrerequisite)
                {
                    assemblyList.Add(CreatePrerequisiteItem(entry2.item));
                }
            }
        }