Skip to content

Commit 1370b99

Browse files
Fix #2893: Add option to disable automatic assembly loading.
This setting is honored by all functionality that triggers a decompilation run. It is ignored by features that load assemblies as their primary function. For example, using the "Load Dependencies" feature will still resolve and load assemblies from the file-system. The same happens when you double-click on an assembly reference in the tree view. It will be resolved and loaded. Note that disabling automatic assembly load will cause the decompiler to potentially not be able to resolve types from references that have not been added manually and the quality of the decompiled code will be inferior as a result.
1 parent 075d616 commit 1370b99

File tree

6 files changed

+32
-5
lines changed

6 files changed

+32
-5
lines changed

ICSharpCode.Decompiler/DecompilerSettings.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,6 +1959,21 @@ public bool ApplyWindowsRuntimeProjections {
19591959
}
19601960
}
19611961

1962+
bool autoLoadAssemblyReferences = true;
1963+
1964+
[Category("DecompilerSettings.Other")]
1965+
[Description("DecompilerSettings.AutoLoadAssemblyReferences")]
1966+
public bool AutoLoadAssemblyReferences {
1967+
get { return autoLoadAssemblyReferences; }
1968+
set {
1969+
if (autoLoadAssemblyReferences != value)
1970+
{
1971+
autoLoadAssemblyReferences = value;
1972+
OnPropertyChanged();
1973+
}
1974+
}
1975+
}
1976+
19621977
#endregion
19631978

19641979
bool forStatement = true;

ILSpy/Commands/GeneratePdbContextMenuEntry.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ internal static void GeneratePdbForAssembly(LoadedAssembly assembly)
8080
{
8181
try
8282
{
83-
var decompiler = new CSharpDecompiler(file, assembly.GetAssemblyResolver(), options.DecompilerSettings);
83+
var decompiler = new CSharpDecompiler(file, assembly.GetAssemblyResolver(options.DecompilerSettings.AutoLoadAssemblyReferences), options.DecompilerSettings);
8484
decompiler.CancellationToken = ct;
8585
PortablePdbWriter.WritePdb(file, decompiler, options.DecompilerSettings, stream, progress: options.Progress);
8686
}

ILSpy/Languages/CSharpLanguage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ public override IReadOnlyList<LanguageVersion> LanguageVersions {
122122

123123
CSharpDecompiler CreateDecompiler(PEFile module, DecompilationOptions options)
124124
{
125-
CSharpDecompiler decompiler = new CSharpDecompiler(module, module.GetAssemblyResolver(), options.DecompilerSettings);
125+
CSharpDecompiler decompiler = new CSharpDecompiler(module, module.GetAssemblyResolver(options.DecompilerSettings.AutoLoadAssemblyReferences), options.DecompilerSettings);
126126
decompiler.CancellationToken = options.CancellationToken;
127127
decompiler.DebugInfoProvider = module.GetDebugInfoOrNull();
128128
while (decompiler.AstTransforms.Count > transformCount)
@@ -416,7 +416,7 @@ public override ProjectId DecompileAssembly(LoadedAssembly assembly, ITextOutput
416416
base.DecompileAssembly(assembly, output, options);
417417

418418
// don't automatically load additional assemblies when an assembly node is selected in the tree view
419-
IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver(loadOnDemand: options.FullDecompilation);
419+
IAssemblyResolver assemblyResolver = assembly.GetAssemblyResolver(loadOnDemand: options.FullDecompilation && options.DecompilerSettings.AutoLoadAssemblyReferences);
420420
var typeSystem = new DecompilerTypeSystem(module, assemblyResolver, options.DecompilerSettings);
421421
var globalType = typeSystem.MainModule.TypeDefinitions.FirstOrDefault();
422422
if (globalType != null)
@@ -507,7 +507,7 @@ class ILSpyWholeProjectDecompiler : WholeProjectDecompiler
507507
readonly DecompilationOptions options;
508508

509509
public ILSpyWholeProjectDecompiler(LoadedAssembly assembly, DecompilationOptions options)
510-
: base(options.DecompilerSettings, assembly.GetAssemblyResolver(), assembly.GetAssemblyReferenceClassifier(options.DecompilerSettings.ApplyWindowsRuntimeProjections), assembly.GetDebugInfoOrNull())
510+
: base(options.DecompilerSettings, assembly.GetAssemblyResolver(options.DecompilerSettings.AutoLoadAssemblyReferences, options.DecompilerSettings.ApplyWindowsRuntimeProjections), assembly.GetAssemblyReferenceClassifier(options.DecompilerSettings.ApplyWindowsRuntimeProjections), assembly.GetDebugInfoOrNull())
511511
{
512512
this.assembly = assembly;
513513
this.options = options;

ILSpy/Properties/Resources.Designer.cs

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ILSpy/Properties/Resources.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,9 @@ Are you sure you want to continue?</value>
282282
<data name="DecompilerSettings.AsyncEnumerator" xml:space="preserve">
283283
<value>Decompile async IAsyncEnumerator methods</value>
284284
</data>
285+
<data name="DecompilerSettings.AutoLoadAssemblyReferences" xml:space="preserve">
286+
<value>Automatically load assembly references</value>
287+
</data>
285288
<data name="DecompilerSettings.CheckedOperators" xml:space="preserve">
286289
<value>User-defined checked operators</value>
287290
</data>

ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public override void ActivateItem(System.Windows.RoutedEventArgs e)
7575

7676
protected override void LoadChildren()
7777
{
78-
var resolver = parentAssembly.LoadedAssembly.GetAssemblyResolver();
78+
var resolver = parentAssembly.LoadedAssembly.GetAssemblyResolver(MainWindow.Instance.CurrentDecompilerSettings.AutoLoadAssemblyReferences);
7979
var module = resolver.Resolve(r);
8080
if (module != null)
8181
{

0 commit comments

Comments
 (0)