diff --git a/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs b/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs index dc1808f104..545b4d0f20 100644 --- a/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs +++ b/ICSharpCode.Decompiler.Tests/RoundtripAssembly.cs @@ -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, settings.UseSdkStyleProjectFormat ? ProjectFileWriterSdkStyle.Create() : ProjectFileWriterDefault.Create(), assemblyReferenceClassifier, debugInfoProvider: null) { } } diff --git a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs index cd29f1d80f..cdc1ec2dbe 100644 --- a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs +++ b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/IProjectInfoProvider.cs @@ -32,7 +32,7 @@ public interface IProjectInfoProvider /// 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 f68fe5bc96..5b07ca3abc 100644 --- a/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/ProjectDecompiler/WholeProjectDecompiler.cs @@ -72,7 +72,7 @@ public LanguageVersion LanguageVersion { public IAssemblyResolver AssemblyResolver { get; } - public AssemblyReferenceClassifier AssemblyReferenceClassifier { get; } + public IAssemblyReferenceClassifier AssemblyReferenceClassifier { get; } public IDebugInfoProvider DebugInfoProvider { get; } @@ -110,9 +110,9 @@ public WholeProjectDecompiler( 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 ?? (settings.UseSdkStyleProjectFormat ? ProjectFileWriterSdkStyle.Create() : ProjectFileWriterDefault.Create()), assemblyReferenceClassifier ?? new AssemblyReferenceClassifier(), debugInfoProvider) { } @@ -121,15 +121,15 @@ protected WholeProjectDecompiler( 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 ?? (Settings.UseSdkStyleProjectFormat ? ProjectFileWriterSdkStyle.Create() : ProjectFileWriterDefault.Create()); + 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 d59ff406ec..834334aa8d 100644 --- a/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs +++ b/ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs @@ -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 { /// /// 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 9fd07c685c..c03334e09c 100644 --- a/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs +++ b/ICSharpCode.ILSpyCmd/BamlAwareWholeProjectDecompiler.cs @@ -37,7 +37,7 @@ sealed class BamlAwareWholeProjectDecompiler : WholeProjectDecompiler 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 d017b515aa..b9754ab75d 100644 --- a/ILSpy/Languages/CSharpLanguage.cs +++ b/ILSpy/Languages/CSharpLanguage.cs @@ -570,7 +570,7 @@ public ResourceHandlerProjectDecompiler( DecompilerSettings settings, IAssemblyResolver resolver, IProjectFileWriter? projectWriter, - AssemblyReferenceClassifier? assemblyReferenceClassifier, + IAssemblyReferenceClassifier? assemblyReferenceClassifier, ICSharpCode.Decompiler.DebugInfo.IDebugInfoProvider? debugInfoProvider) : base(settings, resolver, projectWriter!, assemblyReferenceClassifier!, debugInfoProvider!) {