Esempio n. 1
0
        public static void CopyAssemblyResources(Assembly assembly, string baseDir, bool overwrite = false)
        {
            baseDir ??= string.Empty;

            var resourceNames = assembly.GetManifestResourceNames();

            if (resourceNames.Length > 0 && !Directory.Exists(baseDir))
            {
                Directory.CreateDirectory(baseDir);
            }

            foreach (var resourceName in resourceNames)
            {
                var assemblyName = Hotloader.GetRealAssemblyName(assembly);

                if (!resourceName.Contains(assemblyName.Name + "."))
                {
                    Log.Warning($"{resourceName} does not contain assembly name in assembly: {assemblyName.Name}. <AssemblyName> and <RootNamespace> must be equal inside your plugins .csproj file.");
                }

                var regex    = new Regex(Regex.Escape(assemblyName.Name + "."));
                var fileName = regex.Replace(resourceName, string.Empty, 1);

                var filePath = Path.Combine(baseDir, fileName);
                using var stream = assembly.GetManifestResourceStream(resourceName);
                using var reader = new StreamReader(stream ?? throw new MissingManifestResourceException($"Couldn't find resource: {resourceName}"));
                var fileContent = reader.ReadToEnd();

                if (File.Exists(filePath) && !overwrite)
                {
                    continue;
                }

                File.WriteAllText(filePath, fileContent);
            }
        }
Esempio n. 2
0
        public static void CopyAssemblyResources(Assembly assembly, string?baseDir, bool overwrite = false)
        {
            baseDir ??= string.Empty;

            var resourceNames = assembly.GetManifestResourceNames();

            if (resourceNames.Length > 0 && !Directory.Exists(baseDir))
            {
                Directory.CreateDirectory(baseDir);
            }

            foreach (var resourceName in resourceNames)
            {
                if (resourceName.EndsWith("..directory"))
                {
                    continue;
                }

                var assemblyName = Hotloader.GetRealAssemblyName(assembly);

                if (!resourceName.Contains(assemblyName.Name + "."))
                {
                    Log.Warning(
                        "{ResourceName} does not contain assembly name in assembly: {AssemblyName}. <AssemblyName> and <RootNamespace> must be equal inside your plugins .csproj file",
                        resourceName, assemblyName.Name);
                }

                var regex    = new Regex(Regex.Escape(assemblyName.Name + "."));
                var fileName = regex.Replace(resourceName, string.Empty, 1);

                if (s_ExcludedResources.Contains(fileName))
                {
                    continue;
                }

                var parts = fileName.Split('.');
                fileName = "";

                var pathSb = new StringBuilder(assemblyName.Name + ".");
                foreach (var part in parts)
                {
                    pathSb.Append(part + ".");
                    using var tmpStream = assembly.GetManifestResourceStream(pathSb + ".directory");

                    var isDirectory = tmpStream != null;
                    if (isDirectory)
                    {
                        fileName += part + Path.DirectorySeparatorChar;
                    }
                    else
                    {
                        fileName += part + ".";
                    }
                }

                if (fileName.EndsWith("."))
                {
                    fileName = fileName.Substring(0, fileName.Length - 1);
                }

                var directory = Path.GetDirectoryName(fileName);

                if (directory != null)
                {
                    directory = Path.Combine(baseDir, directory);
                }

                if (directory != null && !Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                var filePath = Path.Combine(baseDir, fileName);
                using var stream = assembly.GetManifestResourceStream(resourceName);
                using var reader = new StreamReader(stream ??
                                                    throw new MissingManifestResourceException(
                                                        $"Couldn't find resource: {resourceName}"));
                var fileContent = reader.ReadToEnd();

                if (File.Exists(filePath) && !overwrite)
                {
                    continue;
                }

                File.WriteAllText(filePath, fileContent);
            }
        }