summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework/ModLoading
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-05-31 21:23:44 -0400
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2022-05-31 21:23:44 -0400
commitbf960ce283d794a11885a5fde6f123a4e6827853 (patch)
tree00986f30b162bc511f3e010c54a0057dffdddc81 /src/SMAPI/Framework/ModLoading
parent9992915f565578949cad8d9bb8ceb360e0db5c85 (diff)
downloadSMAPI-bf960ce283d794a11885a5fde6f123a4e6827853.tar.gz
SMAPI-bf960ce283d794a11885a5fde6f123a4e6827853.tar.bz2
SMAPI-bf960ce283d794a11885a5fde6f123a4e6827853.zip
add backwards compatibility for mods using now-unused dependencies
Diffstat (limited to 'src/SMAPI/Framework/ModLoading')
-rw-r--r--src/SMAPI/Framework/ModLoading/AssemblyLoader.cs38
-rw-r--r--src/SMAPI/Framework/ModLoading/Finders/LegacyAssemblyFinder.cs49
-rw-r--r--src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs11
-rw-r--r--src/SMAPI/Framework/ModLoading/ModMetadata.cs7
4 files changed, 104 insertions, 1 deletions
diff --git a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
index fb5ebc01..e5aaa8ee 100644
--- a/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
+++ b/src/SMAPI/Framework/ModLoading/AssemblyLoader.cs
@@ -163,6 +163,29 @@ namespace StardewModdingAPI.Framework.ModLoading
this.AssemblyDefinitionResolver.Add(assembly.Definition);
}
+ // special case: clear legacy-DLL warnings if the mod bundles a copy
+ if (mod.Warnings.HasFlag(ModWarning.DetectedLegacyCachingDll))
+ {
+ if (File.Exists(Path.Combine(mod.DirectoryPath, "System.Runtime.Caching.dll")))
+ mod.RemoveWarning(ModWarning.DetectedLegacyCachingDll);
+ else
+ {
+ // remove duplicate warnings (System.Runtime.Caching.dll references these)
+ mod.RemoveWarning(ModWarning.DetectedLegacyConfigurationDll);
+ mod.RemoveWarning(ModWarning.DetectedLegacyPermissionsDll);
+ }
+ }
+ if (mod.Warnings.HasFlag(ModWarning.DetectedLegacyConfigurationDll))
+ {
+ if (File.Exists(Path.Combine(mod.DirectoryPath, "System.Configuration.ConfigurationManager.dll")))
+ mod.RemoveWarning(ModWarning.DetectedLegacyConfigurationDll);
+ }
+ if (mod.Warnings.HasFlag(ModWarning.DetectedLegacyPermissionsDll))
+ {
+ if (File.Exists(Path.Combine(mod.DirectoryPath, "System.Security.Permissions.dll")))
+ mod.RemoveWarning(ModWarning.DetectedLegacyPermissionsDll);
+ }
+
// throw if incompatibilities detected
if (!assumeCompatible && mod.Warnings.HasFlag(ModWarning.BrokenCodeLoaded))
throw new IncompatibleInstructionException();
@@ -429,6 +452,21 @@ namespace StardewModdingAPI.Framework.ModLoading
mod.SetWarning(ModWarning.AccessesShell);
break;
+ case InstructionHandleResult.DetectedLegacyCachingDll:
+ template = $"{logPrefix}Detected reference to System.Runtime.Caching.dll, which will be removed in SMAPI 4.0.0.";
+ mod.SetWarning(ModWarning.DetectedLegacyCachingDll);
+ break;
+
+ case InstructionHandleResult.DetectedLegacyConfigurationDll:
+ template = $"{logPrefix}Detected reference to System.Configuration.ConfigurationManager.dll, which will be removed in SMAPI 4.0.0.";
+ mod.SetWarning(ModWarning.DetectedLegacyConfigurationDll);
+ break;
+
+ case InstructionHandleResult.DetectedLegacyPermissionsDll:
+ template = $"{logPrefix}Detected reference to System.Security.Permissions.dll, which will be removed in SMAPI 4.0.0.";
+ mod.SetWarning(ModWarning.DetectedLegacyPermissionsDll);
+ break;
+
case InstructionHandleResult.None:
break;
diff --git a/src/SMAPI/Framework/ModLoading/Finders/LegacyAssemblyFinder.cs b/src/SMAPI/Framework/ModLoading/Finders/LegacyAssemblyFinder.cs
new file mode 100644
index 00000000..d3437b05
--- /dev/null
+++ b/src/SMAPI/Framework/ModLoading/Finders/LegacyAssemblyFinder.cs
@@ -0,0 +1,49 @@
+using Mono.Cecil;
+using StardewModdingAPI.Framework.ModLoading.Framework;
+
+namespace StardewModdingAPI.Framework.ModLoading.Finders
+{
+ /// <summary>Detects assembly references which will break in SMAPI 4.0.0.</summary>
+ internal class LegacyAssemblyFinder : BaseInstructionHandler
+ {
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ public LegacyAssemblyFinder()
+ : base(defaultPhrase: "legacy assembly references") { }
+
+
+ /// <inheritdoc />
+ public override bool Handle(ModuleDefinition module)
+ {
+ foreach (AssemblyNameReference assembly in module.AssemblyReferences)
+ {
+ InstructionHandleResult flag = this.GetFlag(assembly);
+ if (flag is InstructionHandleResult.None)
+ continue;
+
+ this.MarkFlag(flag);
+ }
+
+ return false;
+ }
+
+
+ /*********
+ ** Private methods
+ *********/
+ /// <summary>Get the instruction handle flag for the given assembly reference, if any.</summary>
+ /// <param name="assemblyRef">The assembly reference.</param>
+ private InstructionHandleResult GetFlag(AssemblyNameReference assemblyRef)
+ {
+ return assemblyRef.Name switch
+ {
+ "System.Configuration.ConfigurationManager" => InstructionHandleResult.DetectedLegacyConfigurationDll,
+ "System.Runtime.Caching" => InstructionHandleResult.DetectedLegacyCachingDll,
+ "System.Security.Permission" => InstructionHandleResult.DetectedLegacyPermissionsDll,
+ _ => InstructionHandleResult.None
+ };
+ }
+ }
+}
diff --git a/src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs b/src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs
index e3f108cb..476c30d0 100644
--- a/src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs
+++ b/src/SMAPI/Framework/ModLoading/InstructionHandleResult.cs
@@ -30,6 +30,15 @@ namespace StardewModdingAPI.Framework.ModLoading
DetectedFilesystemAccess,
/// <summary>The instruction accesses the OS shell or processes directly.</summary>
- DetectedShellAccess
+ DetectedShellAccess,
+
+ /// <summary>The module references the legacy <c>System.Configuration.ConfigurationManager</c> assembly and doesn't include a copy in the mod folder, so it'll break in SMAPI 4.0.0.</summary>
+ DetectedLegacyConfigurationDll,
+
+ /// <summary>The module references the legacy <c>System.Runtime.Caching</c> assembly and doesn't include a copy in the mod folder, so it'll break in SMAPI 4.0.0.</summary>
+ DetectedLegacyCachingDll,
+
+ /// <summary>The module references the legacy <c>System.Security.Permissions</c> assembly and doesn't include a copy in the mod folder, so it'll break in SMAPI 4.0.0.</summary>
+ DetectedLegacyPermissionsDll
}
}
diff --git a/src/SMAPI/Framework/ModLoading/ModMetadata.cs b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
index fe54634b..aa4d2d8c 100644
--- a/src/SMAPI/Framework/ModLoading/ModMetadata.cs
+++ b/src/SMAPI/Framework/ModLoading/ModMetadata.cs
@@ -139,6 +139,13 @@ namespace StardewModdingAPI.Framework.ModLoading
}
/// <inheritdoc />
+ public IModMetadata RemoveWarning(ModWarning warning)
+ {
+ this.ActualWarnings &= ~warning;
+ return this;
+ }
+
+ /// <inheritdoc />
public IModMetadata SetMod(IMod mod, TranslationHelper translations)
{
if (this.ContentPack != null)