private static bool AddResources(Project project, List <string> compilerArgs, string intermediateOutputPath) { string root = PathUtility.EnsureTrailingSlash(project.ProjectDirectory); foreach (var resourceFile in project.Files.ResourceFiles) { string resourceName = null; string rootNamespace = null; var resourcePath = resourceFile.Key; if (string.IsNullOrEmpty(resourceFile.Value)) { // No logical name, so use the file name resourceName = ResourcePathUtility.GetResourceName(root, resourcePath); rootNamespace = project.Name; } else { resourceName = CreateCSharpManifestResourceName.EnsureResourceExtension(resourceFile.Value, resourcePath); rootNamespace = null; } var name = CreateCSharpManifestResourceName.CreateManifestName(resourceName, rootNamespace); var fileName = resourcePath; if (ResourcePathUtility.IsResxResourceFile(fileName)) { var ext = Path.GetExtension(fileName); if (string.Equals(ext, ".resx", StringComparison.OrdinalIgnoreCase)) { // {file}.resx -> {file}.resources var resourcesFile = Path.Combine(intermediateOutputPath, name); var result = Command.Create("resgen", $"\"{fileName}\" \"{resourcesFile}\"") .ForwardStdErr() .ForwardStdOut() .Execute(); if (result.ExitCode != 0) { return(false); } // Use this as the resource name instead fileName = resourcesFile; } } compilerArgs.Add($"--resource:\"{fileName}\",{name}"); } return(true); }
// Original source: https://raw.githubusercontent.com/Microsoft/msbuild/82177a50da735cc0443ac10fa490d69368403d71/src/XMakeTasks/CreateCSharpManifestResourceName.cs public static string CreateManifestName(string fileName, string rootNamespace) { var name = new StringBuilder(); // Differences from the msbuild task: // - we do not include the name of the first class (if any) for binary resources or source code // - culture info is ignored if (rootNamespace != null && rootNamespace.Length > 0) { name.Append(rootNamespace).Append("."); } // Replace spaces in the directory name with underscores. // Note that spaces in the file name itself are preserved. var path = MakeValidIdentifier(Path.GetDirectoryName(fileName)); // This is different from the msbuild task: we always append extensions because otherwise, // the emitted resource doesn't have an extension and it is not the same as in the classic // C# assembly if (ResourcePathUtility.IsResxResourceFile(fileName)) { name.Append(Path.Combine(path, Path.GetFileNameWithoutExtension(fileName))); name.Append(".resources"); name.Replace(Path.DirectorySeparatorChar, '.'); name.Replace(Path.AltDirectorySeparatorChar, '.'); } else { name.Append(Path.Combine(path, Path.GetFileName(fileName))); name.Replace(Path.DirectorySeparatorChar, '.'); name.Replace(Path.AltDirectorySeparatorChar, '.'); } return(name.ToString()); }