public static bool Start(string assemblyPath, string outputPathAbsolute, string outputResourcesPath, HashSet <string> simpleNameOfAssembliesToIgnore, HashSet <string> supportedExtensionsLowercase, ILogger logger, ReflectionOnSeparateAppDomainHandler reflectionOnSeparateAppDomain, bool isBridgeBasedVersion, string nameOfAssembliesThatDoNotContainUserCode, out List <string> resXFilesCopied) { resXFilesCopied = new List <string>(); List <string> assemblySimpleNames; reflectionOnSeparateAppDomain.LoadAssemblyAndAllReferencedAssembliesRecursively( assemblyPath, isBridgeBasedVersion: isBridgeBasedVersion, isCoreAssembly: false, nameOfAssembliesThatDoNotContainUserCode: nameOfAssembliesThatDoNotContainUserCode, skipReadingAttributesFromAssemblies: true, assemblySimpleNames: out assemblySimpleNames); foreach (string assemblySimpleName in assemblySimpleNames) { if (!simpleNameOfAssembliesToIgnore.Contains(assemblySimpleName)) { //----------------------------------------------- // Process JavaScript, CSS, Image, Video, Audio files: //----------------------------------------------- #if !CSHTML5BLAZOR Dictionary <string, byte[]> jsAndCssFiles = reflectionOnSeparateAppDomain.GetResources(assemblySimpleName, supportedExtensionsLowercase); #else Dictionary <string, byte[]> jsAndCssFiles = reflectionOnSeparateAppDomain.GetManifestResources(assemblySimpleName, supportedExtensionsLowercase); #endif // Copy files: foreach (KeyValuePair <string, byte[]> file in jsAndCssFiles) { string fileName = file.Key; byte[] fileContent = file.Value; // Combine the root output path and the relative "resources" folder path, while also ensuring that there is no forward slash, and that the path ends with a backslash: string absoluteOutputResourcesPath = PathsHelper.CombinePathsWhileEnsuringEndingBackslashAndMore(outputPathAbsolute, outputResourcesPath); // Create the destination folders hierarchy if it does not already exist: string destinationFile = Path.Combine(absoluteOutputResourcesPath, assemblySimpleName + "\\", fileName); if (destinationFile.Length < 256) { string destinationDirectory = Path.GetDirectoryName(destinationFile); if (!Directory.Exists(destinationDirectory)) { Directory.CreateDirectory(destinationDirectory); } // Create the file: File.WriteAllBytes(destinationFile, fileContent); //put the file name in the list of files: if (fileName.EndsWith(".resx.js")) { resXFilesCopied.Add(destinationFile); } } else { logger.WriteWarning("Could not create the following output file because its path is too long: " + destinationFile); } } #region Commented because this operation is now done in the "JavaScriptGenerator" build task ("ConvertingResXFilesToJavaScript.cs"). ////----------------------------------------------- //// Process RESX files: ////----------------------------------------------- //Dictionary<string, byte[]> resXFiles = reflectionOnSeparateAppDomain.GetManifestResources(assemblySimpleName, // (fn) => fn.ToLower().EndsWith(".resources") && !fn.ToLower().EndsWith(".g.resources")); //foreach (KeyValuePair<string, byte[]> file in resXFiles) //{ // string fileName = file.Key; // byte[] fileContent = file.Value; // // Create destination folders hierarchy: // string destinationFile = Path.Combine(outputPath, ResourceCopier.NAME_OF_FOLDER_THAT_CONTAINS_RESOURCES + "\\", Path.GetFileNameWithoutExtension(fileName) + ".resj"); // string destinationDirectory = Path.GetDirectoryName(destinationFile); // Directory.CreateDirectory(destinationDirectory); // // Create JSON from RESX: // string json = ""; // using (Stream stream = new MemoryStream(fileContent)) // { // json = ConvertingResXFilesToJavaScript.ConvertResources(stream); // } // // Save file: // File.WriteAllText(destinationFile, json); //} #endregion } } return(true); }