diff --git a/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs b/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs index dc1808f10..6fc0feea9 100644 --- a/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs +++ b/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs @@ -290,8 +290,8 @@ namespace ICSharpCode.Decompiler.Roundtrip 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) { } } diff --git a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs index cd29f1d80..cdc1ec2db 100644 --- a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs +++ b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler /// IAssemblyResolver AssemblyResolver { get; } - AssemblyReferenceClassifier AssemblyReferenceClassifier { get; } + IAssemblyReferenceClassifier AssemblyReferenceClassifier { get; } /// /// Gets the C# language version of the project. diff --git a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs index 067c03010..5ded93304 100644 --- a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs @@ -73,7 +73,7 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler public IAssemblyResolver AssemblyResolver { get; } - public AssemblyReferenceClassifier AssemblyReferenceClassifier { get; } + public IAssemblyReferenceClassifier AssemblyReferenceClassifier { get; } public IDebugInfoProvider DebugInfoProvider { get; } @@ -111,9 +111,9 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler DecompilerSettings settings, IAssemblyResolver assemblyResolver, IProjectFileWriter projectWriter, - AssemblyReferenceClassifier assemblyReferenceClassifier, + IAssemblyReferenceClassifier assemblyReferenceClassifier, IDebugInfoProvider debugInfoProvider) - : this(settings, Guid.NewGuid(), assemblyResolver, projectWriter, assemblyReferenceClassifier, debugInfoProvider) + : this(settings, Guid.NewGuid(), assemblyResolver, projectWriter ?? IProjectFileWriter.FromSettings(settings), assemblyReferenceClassifier ?? new AssemblyReferenceClassifier(), debugInfoProvider) { } @@ -122,15 +122,15 @@ namespace ICSharpCode.Decompiler.CSharp.ProjectDecompiler Guid projectGuid, IAssemblyResolver assemblyResolver, IProjectFileWriter projectWriter, - AssemblyReferenceClassifier assemblyReferenceClassifier, + 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 diff --git a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs index d59ff406e..834334aa8 100644 --- a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs +++ b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs @@ -67,7 +67,13 @@ namespace ICSharpCode.Decompiler.Metadata #endif } - public class AssemblyReferenceClassifier + public interface IAssemblyReferenceClassifier + { + bool IsGacAssembly(IAssemblyReference reference); + bool IsSharedAssembly(IAssemblyReference reference, [NotNullWhen(true)] out string? runtimePack); + } + + public class AssemblyReferenceClassifier : IAssemblyReferenceClassifier { /// /// For GAC assembly references, the WholeProjectDecompiler will omit the HintPath in the diff --git a/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs b/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs index 9fd07c685..c03334e09 100644 --- a/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs +++ b/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs @@ -37,7 +37,7 @@ namespace ICSharpCode.ILSpyCmd public BamlAwareWholeProjectDecompiler( DecompilerSettings settings, IAssemblyResolver assemblyResolver, - AssemblyReferenceClassifier assemblyReferenceClassifier, + IAssemblyReferenceClassifier assemblyReferenceClassifier, IDebugInfoProvider debugInfoProvider, BamlDecompilerTypeSystem bamlTypeSystem, BamlDecompilerSettings bamlSettings) diff --git a/ILSpy/Languages/CSharpLanguage.cs b/ILSpy/Languages/CSharpLanguage.cs index fc027541e..67edae098 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -581,7 +581,7 @@ namespace ICSharpCode.ILSpy.Languages DecompilerSettings settings, IAssemblyResolver resolver, IProjectFileWriter? projectWriter, - AssemblyReferenceClassifier? assemblyReferenceClassifier, + IAssemblyReferenceClassifier? assemblyReferenceClassifier, ICSharpCode.Decompiler.DebugInfo.IDebugInfoProvider? debugInfoProvider) : base(settings, resolver, projectWriter!, assemblyReferenceClassifier!, debugInfoProvider!) {