From fd7f81ac9c1fbf1ba0427f23fb0f2de3d9c5a028 Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 25 Aug 2021 23:19:47 -0400 Subject: fix assembly resolver not tracking loaded mods correctly --- .../Framework/ModLoading/AssemblyDefinitionResolver.cs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/SMAPI/Framework') diff --git a/src/SMAPI/Framework/ModLoading/AssemblyDefinitionResolver.cs b/src/SMAPI/Framework/ModLoading/AssemblyDefinitionResolver.cs index b3415609..8e2f5ef3 100644 --- a/src/SMAPI/Framework/ModLoading/AssemblyDefinitionResolver.cs +++ b/src/SMAPI/Framework/ModLoading/AssemblyDefinitionResolver.cs @@ -21,13 +21,13 @@ namespace StardewModdingAPI.Framework.ModLoading public void Add(params AssemblyDefinition[] assemblies) { foreach (AssemblyDefinition assembly in assemblies) - this.Add(assembly, assembly.Name.Name, assembly.Name.FullName); + this.AddWithExplicitNames(assembly, assembly.Name.Name, assembly.Name.FullName); } - /// Add known assemblies to the resolver. + /// Add a known assembly to the resolver with the given names. This overrides the assembly names that would normally be assigned. /// The assembly to add. /// The assembly names for which it should be returned. - public void Add(AssemblyDefinition assembly, params string[] names) + public void AddWithExplicitNames(AssemblyDefinition assembly, params string[] names) { this.RegisterAssembly(assembly); foreach (string name in names) @@ -36,12 +36,18 @@ namespace StardewModdingAPI.Framework.ModLoading /// Resolve an assembly reference. /// The assembly name. - public override AssemblyDefinition Resolve(AssemblyNameReference name) => this.ResolveName(name.Name) ?? base.Resolve(name); + public override AssemblyDefinition Resolve(AssemblyNameReference name) + { + return this.ResolveName(name.Name) ?? base.Resolve(name); + } /// Resolve an assembly reference. /// The assembly name. /// The assembly reader parameters. - public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) => this.ResolveName(name.Name) ?? base.Resolve(name, parameters); + public override AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) + { + return this.ResolveName(name.Name) ?? base.Resolve(name, parameters); + } /********* -- cgit From 08b180ca891e51773fb5f96d3cf3721b865ec04c Mon Sep 17 00:00:00 2001 From: Jesse Plamondon-Willard Date: Wed, 25 Aug 2021 23:56:46 -0400 Subject: add failsafe when loading symbols --- src/SMAPI/Framework/ModLoading/AssemblyLoader.cs | 27 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/SMAPI/Framework') diff --git a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs index e1ad9d37..3e35c9dd 100644 --- a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs +++ b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs @@ -233,15 +233,28 @@ namespace StardewModdingAPI.Framework.ModLoading if (!file.Exists) yield break; // not a local assembly - // read assembly and symbols - byte[] assemblyBytes = File.ReadAllBytes(file.FullName); - Stream readStream = this.TrackForDisposal(new MemoryStream(assemblyBytes)); + // read assembly + AssemblyDefinition assembly; { - FileInfo symbolsFile = new FileInfo(Path.Combine(Path.GetDirectoryName(file.FullName)!, Path.GetFileNameWithoutExtension(file.FullName)) + ".pdb"); - if (symbolsFile.Exists) - this.SymbolReaderProvider.TryAddSymbolData(file.Name, () => this.TrackForDisposal(symbolsFile.OpenRead())); + byte[] assemblyBytes = File.ReadAllBytes(file.FullName); + Stream readStream = this.TrackForDisposal(new MemoryStream(assemblyBytes)); + + try + { + // read assembly with symbols + FileInfo symbolsFile = new FileInfo(Path.Combine(Path.GetDirectoryName(file.FullName)!, Path.GetFileNameWithoutExtension(file.FullName)) + ".pdb"); + if (symbolsFile.Exists) + this.SymbolReaderProvider.TryAddSymbolData(file.Name, () => this.TrackForDisposal(symbolsFile.OpenRead())); + assembly = this.TrackForDisposal(AssemblyDefinition.ReadAssembly(readStream, new ReaderParameters(ReadingMode.Immediate) { AssemblyResolver = assemblyResolver, InMemory = true, ReadSymbols = true, SymbolReaderProvider = this.SymbolReaderProvider })); + } + catch (SymbolsNotMatchingException ex) + { + // read assembly without symbols + this.Monitor.Log($" Failed loading PDB for '{file.Name}'. Technical details:\n{ex}"); + readStream.Position = 0; + assembly = this.TrackForDisposal(AssemblyDefinition.ReadAssembly(readStream, new ReaderParameters(ReadingMode.Immediate) { AssemblyResolver = assemblyResolver, InMemory = true })); + } } - AssemblyDefinition assembly = this.TrackForDisposal(AssemblyDefinition.ReadAssembly(readStream, new ReaderParameters(ReadingMode.Immediate) { AssemblyResolver = assemblyResolver, InMemory = true, ReadSymbols = true, SymbolReaderProvider = this.SymbolReaderProvider })); // skip if already visited if (visitedAssemblyNames.Contains(assembly.Name.Name)) -- cgit