Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,8 @@ static async Task RunTest(string outputDir, string fileToTest)

class TestProjectDecompiler : WholeProjectDecompiler
{
public TestProjectDecompiler(Guid projectGuid, IAssemblyResolver resolver, AssemblyReferenceClassifier assemblyReferenceClassifier, DecompilerSettings settings)
: base(settings, projectGuid, resolver, null, assemblyReferenceClassifier, debugInfoProvider: null)
public TestProjectDecompiler(Guid projectGuid, IAssemblyResolver resolver, IAssemblyReferenceClassifier assemblyReferenceClassifier, DecompilerSettings settings)
: base(settings, projectGuid, resolver, IProjectFileWriter.FromSettings(settings), assemblyReferenceClassifier, debugInfoProvider: null)
{
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public interface IProjectInfoProvider
/// </summary>
IAssemblyResolver AssemblyResolver { get; }

AssemblyReferenceClassifier AssemblyReferenceClassifier { get; }
IAssemblyReferenceClassifier AssemblyReferenceClassifier { get; }

/// <summary>
/// Gets the C# language version of the project.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@

using static ICSharpCode.Decompiler.Metadata.MetadataExtensions;

#nullable enable

namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler
{
/// <summary>
Expand Down Expand Up @@ -73,9 +75,9 @@ public LanguageVersion LanguageVersion {

public IAssemblyResolver AssemblyResolver { get; }

public AssemblyReferenceClassifier AssemblyReferenceClassifier { get; }
public IAssemblyReferenceClassifier AssemblyReferenceClassifier { get; }

public IDebugInfoProvider DebugInfoProvider { get; }
public IDebugInfoProvider? DebugInfoProvider { get; }

/// <summary>
/// The MSBuild ProjectGuid to use for the new project.
Expand All @@ -89,17 +91,17 @@ public LanguageVersion LanguageVersion {
/// This property is set by DecompileProject() and protected so that overridden protected members
/// can access it.
/// </remarks>
public string TargetDirectory { get; protected set; }
public string TargetDirectory { get; protected set; } = string.Empty;

/// <summary>
/// Path to the snk file to use for signing.
/// <c>null</c> to not sign.
/// </summary>
public string StrongNameKeyFile { get; set; }
public string? StrongNameKeyFile { get; set; }

public int MaxDegreeOfParallelism { get; set; } = Environment.ProcessorCount;

public IProgress<DecompilationProgress> ProgressIndicator { get; set; }
public IProgress<DecompilationProgress>? ProgressIndicator { get; set; }
#endregion

public WholeProjectDecompiler(IAssemblyResolver assemblyResolver)
Expand All @@ -110,10 +112,10 @@ public WholeProjectDecompiler(IAssemblyResolver assemblyResolver)
public WholeProjectDecompiler(
DecompilerSettings settings,
IAssemblyResolver assemblyResolver,
IProjectFileWriter projectWriter,
AssemblyReferenceClassifier assemblyReferenceClassifier,
IDebugInfoProvider debugInfoProvider)
: this(settings, Guid.NewGuid(), assemblyResolver, projectWriter, assemblyReferenceClassifier, debugInfoProvider)
IProjectFileWriter? projectWriter,
IAssemblyReferenceClassifier? assemblyReferenceClassifier,
IDebugInfoProvider? debugInfoProvider)
: this(settings, Guid.NewGuid(), assemblyResolver, projectWriter ?? IProjectFileWriter.FromSettings(settings), assemblyReferenceClassifier ?? new AssemblyReferenceClassifier(), debugInfoProvider)
{
}

Expand All @@ -122,15 +124,15 @@ protected WholeProjectDecompiler(
Guid projectGuid,
IAssemblyResolver assemblyResolver,
IProjectFileWriter projectWriter,
AssemblyReferenceClassifier assemblyReferenceClassifier,
IDebugInfoProvider debugInfoProvider)
IAssemblyReferenceClassifier assemblyReferenceClassifier,
IDebugInfoProvider? debugInfoProvider)
{
Settings = settings ?? throw new ArgumentNullException(nameof(settings));
ProjectGuid = projectGuid;
AssemblyResolver = assemblyResolver ?? throw new ArgumentNullException(nameof(assemblyResolver));
AssemblyReferenceClassifier = assemblyReferenceClassifier ?? new AssemblyReferenceClassifier();
AssemblyReferenceClassifier = assemblyReferenceClassifier ?? throw new ArgumentNullException(nameof(assemblyReferenceClassifier));
DebugInfoProvider = debugInfoProvider;
this.projectWriter = projectWriter ?? IProjectFileWriter.FromSettings(settings);
this.projectWriter = projectWriter ?? throw new ArgumentNullException(nameof(projectWriter));
}

// per-run members
Expand Down Expand Up @@ -355,7 +357,7 @@ protected virtual IEnumerable<ProjectItemInfo> WriteResourceFilesInProject(Metad
{
foreach (var r in module.Resources.Where(r => r.ResourceType == ResourceType.Embedded))
{
Stream stream = r.TryOpenStream();
Stream? stream = r.TryOpenStream();
if (stream == null)
continue;

Expand All @@ -373,12 +375,12 @@ protected virtual IEnumerable<ProjectItemInfo> WriteResourceFilesInProject(Metad
foreach (var (name, value) in resourcesFile)
{
string fileName = SanitizeFileName(name);
string dirName = Path.GetDirectoryName(fileName);
string? dirName = Path.GetDirectoryName(fileName);
if (!string.IsNullOrEmpty(dirName) && directories.Add(dirName))
{
CreateDirectory(Path.Combine(TargetDirectory, dirName));
}
Stream entryStream = (Stream)value;
Stream entryStream = (Stream)value!;
entryStream.Position = 0;
individualResources.AddRange(
WriteResourceToFile(fileName, name, entryStream));
Expand Down Expand Up @@ -495,14 +497,14 @@ protected virtual IEnumerable<ProjectItemInfo> WriteMiscellaneousFilesInProject(
if (resources == null)
yield break;

byte[] appIcon = CreateApplicationIcon(resources);
byte[]? appIcon = CreateApplicationIcon(resources);
if (appIcon != null)
{
File.WriteAllBytes(Path.Combine(TargetDirectory, "app.ico"), appIcon);
yield return new ProjectItemInfo("ApplicationIcon", "app.ico");
}

byte[] appManifest = CreateApplicationManifest(resources);
byte[]? appManifest = CreateApplicationManifest(resources);
if (appManifest != null && !IsDefaultApplicationManifest(appManifest))
{
File.WriteAllBytes(Path.Combine(TargetDirectory, "app.manifest"), appManifest);
Expand All @@ -520,7 +522,7 @@ protected virtual IEnumerable<ProjectItemInfo> WriteMiscellaneousFilesInProject(
const int RT_ICON = 3;
const int RT_GROUP_ICON = 14;

unsafe static byte[] CreateApplicationIcon(Win32ResourceDirectory resources)
unsafe static byte[]? CreateApplicationIcon(Win32ResourceDirectory resources)
{
var iconGroup = resources.Find(new Win32ResourceName(RT_GROUP_ICON))?.FirstDirectory()?.FirstData()?.Data;
if (iconGroup == null)
Expand Down Expand Up @@ -598,7 +600,7 @@ struct GRPICONDIRENTRY

const int RT_MANIFEST = 24;

unsafe static byte[] CreateApplicationManifest(Win32ResourceDirectory resources)
unsafe static byte[]? CreateApplicationManifest(Win32ResourceDirectory resources)
{
return resources.Find(new Win32ResourceName(RT_MANIFEST))?.FirstDirectory()?.FirstData()?.Data;
}
Expand Down Expand Up @@ -641,12 +643,12 @@ static string CleanUpApplicationManifest(byte[] appManifest)
/// <summary>
/// Cleans up a node name for use as a file name.
/// </summary>
public static string CleanUpFileName(string text, string extension)
public static string CleanUpFileName(string text, string? extension)
{
Debug.Assert(!string.IsNullOrEmpty(extension));
if (!extension.StartsWith("."))
extension = "." + extension;
text = text + extension;
if (string.IsNullOrEmpty(extension) || extension.StartsWith("."))
text = $"{text}{extension}";
else
text = $"{text}.{extension}";

return CleanUpName(text, separateAtDots: false, treatAsFileName: !string.IsNullOrEmpty(extension), treatAsPath: false);
}
Expand All @@ -668,7 +670,7 @@ public static string SanitizeFileName(string fileName)
/// </summary>
static string CleanUpName(string text, bool separateAtDots, bool treatAsFileName, bool treatAsPath)
{
string extension = null;
string? extension = null;
int currentSegmentLength = 0;
// Extract extension from the end of the name, if valid
if (treatAsFileName)
Expand Down Expand Up @@ -864,9 +866,9 @@ public static bool CanUseSdkStyleProjectFormat(MetadataFile module)

public record struct ProjectItemInfo(string ItemType, string FileName)
{
public List<PartialTypeInfo> PartialTypes { get; set; } = null;
public List<PartialTypeInfo>? PartialTypes { get; set; } = null;

public Dictionary<string, string> AdditionalProperties { get; set; } = null;
public Dictionary<string, string>? AdditionalProperties { get; set; } = null;

public ProjectItemInfo With(string name, string value)
{
Expand Down
8 changes: 7 additions & 1 deletion ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,13 @@ public interface IAssemblyResolver
#endif
}

public class AssemblyReferenceClassifier
public interface IAssemblyReferenceClassifier
{
bool IsGacAssembly(IAssemblyReference reference);
bool IsSharedAssembly(IAssemblyReference reference, [NotNullWhen(true)] out string? runtimePack);
}

public class AssemblyReferenceClassifier : IAssemblyReferenceClassifier
{
/// <summary>
/// For GAC assembly references, the WholeProjectDecompiler will omit the HintPath in the
Expand Down
2 changes: 1 addition & 1 deletion ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ sealed class BamlAwareWholeProjectDecompiler : WholeProjectDecompiler
public BamlAwareWholeProjectDecompiler(
DecompilerSettings settings,
IAssemblyResolver assemblyResolver,
AssemblyReferenceClassifier assemblyReferenceClassifier,
IAssemblyReferenceClassifier assemblyReferenceClassifier,
IDebugInfoProvider debugInfoProvider,
BamlDecompilerTypeSystem bamlTypeSystem,
BamlDecompilerSettings bamlSettings)
Expand Down
2 changes: 1 addition & 1 deletion ILSpy/Languages/CSharpLanguage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -581,7 +581,7 @@ public ResourceHandlerProjectDecompiler(
DecompilerSettings settings,
IAssemblyResolver resolver,
IProjectFileWriter? projectWriter,
AssemblyReferenceClassifier? assemblyReferenceClassifier,
IAssemblyReferenceClassifier? assemblyReferenceClassifier,
ICSharpCode.Decompiler.DebugInfo.IDebugInfoProvider? debugInfoProvider)
: base(settings, resolver, projectWriter!, assemblyReferenceClassifier!, debugInfoProvider!)
{
Expand Down
Loading