diff --git a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs index decbba428..6444def9f 100644 --- a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs @@ -373,7 +373,7 @@ namespace ICSharpCode.Decompiler.CSharp Stream entryStream = (Stream)value; entryStream.Position = 0; individualResources.AddRange( - WriteResourceToFile(Path.Combine(targetDirectory, fileName), (string)name, entryStream)); + WriteResourceToFile(fileName, (string)name, entryStream)); } decodedIntoIndividualFiles = true; } else { @@ -388,7 +388,7 @@ namespace ICSharpCode.Decompiler.CSharp } } else { stream.Position = 0; - string fileName = Path.ChangeExtension(GetFileNameForResource(r.Name), ".resource"); + string fileName = GetFileNameForResource(r.Name); foreach (var entry in WriteResourceToFile(fileName, r.Name, stream)) { yield return entry; } @@ -406,10 +406,24 @@ namespace ICSharpCode.Decompiler.CSharp protected virtual IEnumerable> WriteResourceToFile(string fileName, string resourceName, Stream entryStream) { - using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) { + if (fileName.EndsWith(".resources", StringComparison.OrdinalIgnoreCase)) { + string resx = Path.ChangeExtension(fileName, ".resx"); + try { + using (FileStream fs = new FileStream(Path.Combine(targetDirectory, resx), FileMode.Create, FileAccess.Write)) + using (ResXResourceWriter writer = new ResXResourceWriter(fs)) { + foreach (var entry in new ResourcesFile(entryStream)) { + writer.AddResource(entry.Key, entry.Value); + } + } + return new[] { Tuple.Create("EmbeddedResource", resx) }; + } catch (BadImageFormatException) { + // if the .resources can't be decoded, just save them as-is + } + } + using (FileStream fs = new FileStream(Path.Combine(targetDirectory, fileName), FileMode.Create, FileAccess.Write)) { entryStream.CopyTo(fs); } - yield return Tuple.Create("EmbeddedResource", fileName); + return new[] { Tuple.Create("EmbeddedResource", fileName) }; } string GetFileNameForResource(string fullName) diff --git a/ICSharpCode.Decompiler/Util/ResXResourceWriter.cs b/ICSharpCode.Decompiler/Util/ResXResourceWriter.cs index c600830fe..a3e44ccad 100644 --- a/ICSharpCode.Decompiler/Util/ResXResourceWriter.cs +++ b/ICSharpCode.Decompiler/Util/ResXResourceWriter.cs @@ -466,11 +466,11 @@ namespace ICSharpCode.Decompiler.Util public void Close() { - if (!written) { - Generate(); - } - if (writer != null) { + if (!written) { + Generate(); + } + writer.Close(); stream = null; filename = null; diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index 2f38c139b..ebcdf951e 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -392,20 +392,12 @@ namespace ICSharpCode.ILSpy protected override IEnumerable> WriteResourceToFile(string fileName, string resourceName, Stream entryStream) { - if (fileName.EndsWith(".resource", StringComparison.OrdinalIgnoreCase)) { - fileName = Path.ChangeExtension(fileName, ".resx"); - using (FileStream fs = new FileStream(Path.Combine(targetDirectory, fileName), FileMode.Create, FileAccess.Write)) - using (ResXResourceWriter writer = new ResXResourceWriter(fs)) { - foreach (var entry in new ResourcesFile(entryStream)) { - writer.AddResource(entry.Key, entry.Value); - } - } - return new[] { Tuple.Create("EmbeddedResource", fileName) }; - } foreach (var handler in App.ExportProvider.GetExportedValues()) { if (handler.CanHandle(fileName, options)) { entryStream.Position = 0; - return new[] { Tuple.Create(handler.EntryType, handler.WriteResourceToFile(assembly, fileName, entryStream, options)) }; + fileName = Path.Combine(targetDirectory, fileName); + fileName = handler.WriteResourceToFile(assembly, fileName, entryStream, options); + return new[] { Tuple.Create(handler.EntryType, fileName) }; } } return base.WriteResourceToFile(fileName, resourceName, entryStream);