add backwards compatibility for mods using now-unused dependencies
This commit is contained in:
parent
9992915f56
commit
bf960ce283
|
@ -70,6 +70,11 @@
|
||||||
|
|
||||||
<!-- .NET dependencies -->
|
<!-- .NET dependencies -->
|
||||||
<Copy SourceFiles="$(TargetDir)\System.Management.dll" DestinationFolder="$(GamePath)\smapi-internal" Condition="$(OS) == 'Windows_NT'" />
|
<Copy SourceFiles="$(TargetDir)\System.Management.dll" DestinationFolder="$(GamePath)\smapi-internal" Condition="$(OS) == 'Windows_NT'" />
|
||||||
|
|
||||||
|
<!-- Legacy .NET dependencies (remove in SMAPI 4.0.0) -->
|
||||||
|
<Copy SourceFiles="$(TargetDir)\System.Configuration.ConfigurationManager.dll" DestinationFolder="$(GamePath)\smapi-internal" />
|
||||||
|
<Copy SourceFiles="$(TargetDir)\System.Runtime.Caching.dll" DestinationFolder="$(GamePath)\smapi-internal" />
|
||||||
|
<Copy SourceFiles="$(TargetDir)\System.Security.Permissions.dll" DestinationFolder="$(GamePath)\smapi-internal" />
|
||||||
</Target>
|
</Target>
|
||||||
|
|
||||||
<Target Name="CopyDefaultMods" Condition="'$(MSBuildProjectName)' == 'SMAPI.Mods.ConsoleCommands' OR '$(MSBuildProjectName)' == 'SMAPI.Mods.ErrorHandler' OR '$(MSBuildProjectName)' == 'SMAPI.Mods.SaveBackup'">
|
<Target Name="CopyDefaultMods" Condition="'$(MSBuildProjectName)' == 'SMAPI.Mods.ConsoleCommands' OR '$(MSBuildProjectName)' == 'SMAPI.Mods.ErrorHandler' OR '$(MSBuildProjectName)' == 'SMAPI.Mods.SaveBackup'">
|
||||||
|
|
|
@ -151,6 +151,11 @@ for folder in ${folders[@]}; do
|
||||||
cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
|
cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# copy legacy .NET dependencies (remove in SMAPI 4.0.0)
|
||||||
|
cp "$smapiBin/System.Configuration.ConfigurationManager.dll" "$bundlePath/smapi-internal"
|
||||||
|
cp "$smapiBin/System.Runtime.Caching.dll" "$bundlePath/smapi-internal"
|
||||||
|
cp "$smapiBin/System.Security.Permissions.dll" "$bundlePath/smapi-internal"
|
||||||
|
|
||||||
# copy bundled mods
|
# copy bundled mods
|
||||||
for modName in ${bundleModNames[@]}; do
|
for modName in ${bundleModNames[@]}; do
|
||||||
fromPath="src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
|
fromPath="src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
|
||||||
|
|
|
@ -172,6 +172,11 @@ foreach ($folder in $folders) {
|
||||||
cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
|
cp "$smapiBin/System.Management.dll" "$bundlePath/smapi-internal"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# copy legacy .NET dependencies (remove in SMAPI 4.0.0)
|
||||||
|
cp "$smapiBin/System.Configuration.ConfigurationManager.dll" "$bundlePath/smapi-internal"
|
||||||
|
cp "$smapiBin/System.Runtime.Caching.dll" "$bundlePath/smapi-internal"
|
||||||
|
cp "$smapiBin/System.Security.Permissions.dll" "$bundlePath/smapi-internal"
|
||||||
|
|
||||||
# copy bundled mods
|
# copy bundled mods
|
||||||
foreach ($modName in $bundleModNames) {
|
foreach ($modName in $bundleModNames) {
|
||||||
$fromPath = "src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
|
$fromPath = "src/SMAPI.Mods.$modName/bin/$buildConfig/$runtime/publish"
|
||||||
|
|
|
@ -35,6 +35,15 @@ namespace StardewModdingAPI.Toolkit.Framework.ModData
|
||||||
AccessesFilesystem = 128,
|
AccessesFilesystem = 128,
|
||||||
|
|
||||||
/// <summary>Uses .NET APIs for shell or process access.</summary>
|
/// <summary>Uses .NET APIs for shell or process access.</summary>
|
||||||
AccessesShell = 256
|
AccessesShell = 256,
|
||||||
|
|
||||||
|
/// <summary>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 = 512,
|
||||||
|
|
||||||
|
/// <summary>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 = 1024,
|
||||||
|
|
||||||
|
/// <summary>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 = 2048
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,10 @@ namespace StardewModdingAPI.Framework
|
||||||
/// <param name="warning">The warning to set.</param>
|
/// <param name="warning">The warning to set.</param>
|
||||||
IModMetadata SetWarning(ModWarning warning);
|
IModMetadata SetWarning(ModWarning warning);
|
||||||
|
|
||||||
|
/// <summary>Remove a warning flag for the mod.</summary>
|
||||||
|
/// <param name="warning">The warning to remove.</param>
|
||||||
|
IModMetadata RemoveWarning(ModWarning warning);
|
||||||
|
|
||||||
/// <summary>Set the mod instance.</summary>
|
/// <summary>Set the mod instance.</summary>
|
||||||
/// <param name="mod">The mod instance to set.</param>
|
/// <param name="mod">The mod instance to set.</param>
|
||||||
/// <param name="translations">The translations for this mod (if loaded).</param>
|
/// <param name="translations">The translations for this mod (if loaded).</param>
|
||||||
|
|
|
@ -163,6 +163,29 @@ namespace StardewModdingAPI.Framework.ModLoading
|
||||||
this.AssemblyDefinitionResolver.Add(assembly.Definition);
|
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
|
// throw if incompatibilities detected
|
||||||
if (!assumeCompatible && mod.Warnings.HasFlag(ModWarning.BrokenCodeLoaded))
|
if (!assumeCompatible && mod.Warnings.HasFlag(ModWarning.BrokenCodeLoaded))
|
||||||
throw new IncompatibleInstructionException();
|
throw new IncompatibleInstructionException();
|
||||||
|
@ -429,6 +452,21 @@ namespace StardewModdingAPI.Framework.ModLoading
|
||||||
mod.SetWarning(ModWarning.AccessesShell);
|
mod.SetWarning(ModWarning.AccessesShell);
|
||||||
break;
|
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:
|
case InstructionHandleResult.None:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,6 +30,15 @@ namespace StardewModdingAPI.Framework.ModLoading
|
||||||
DetectedFilesystemAccess,
|
DetectedFilesystemAccess,
|
||||||
|
|
||||||
/// <summary>The instruction accesses the OS shell or processes directly.</summary>
|
/// <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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,6 +138,13 @@ namespace StardewModdingAPI.Framework.ModLoading
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public IModMetadata RemoveWarning(ModWarning warning)
|
||||||
|
{
|
||||||
|
this.ActualWarnings &= ~warning;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IModMetadata SetMod(IMod mod, TranslationHelper translations)
|
public IModMetadata SetMod(IMod mod, TranslationHelper translations)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1679,6 +1679,31 @@ namespace StardewModdingAPI.Framework
|
||||||
}
|
}
|
||||||
#pragma warning restore CS0612, CS0618
|
#pragma warning restore CS0612, CS0618
|
||||||
|
|
||||||
|
// log deprecation warnings
|
||||||
|
if (metadata.HasWarnings(ModWarning.DetectedLegacyCachingDll, ModWarning.DetectedLegacyConfigurationDll, ModWarning.DetectedLegacyPermissionsDll))
|
||||||
|
{
|
||||||
|
string?[] referenced =
|
||||||
|
new[]
|
||||||
|
{
|
||||||
|
metadata.Warnings.HasFlag(ModWarning.DetectedLegacyConfigurationDll) ? "System.Configuration.ConfigurationManager" : null,
|
||||||
|
metadata.Warnings.HasFlag(ModWarning.DetectedLegacyCachingDll) ? "System.Runtime.Caching" : null,
|
||||||
|
metadata.Warnings.HasFlag(ModWarning.DetectedLegacyPermissionsDll) ? "System.Security.Permissions" : null
|
||||||
|
}
|
||||||
|
.Where(p => p is not null)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
foreach (string? name in referenced)
|
||||||
|
{
|
||||||
|
DeprecationManager.Warn(
|
||||||
|
metadata,
|
||||||
|
$"using {name} without bundling it",
|
||||||
|
"3.14.7",
|
||||||
|
DeprecationLevel.Notice,
|
||||||
|
logStackTrace: false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// call entry method
|
// call entry method
|
||||||
Context.HeuristicModsRunningCode.Push(metadata);
|
Context.HeuristicModsRunningCode.Push(metadata);
|
||||||
try
|
try
|
||||||
|
|
|
@ -53,6 +53,9 @@ namespace StardewModdingAPI.Metadata
|
||||||
|
|
||||||
// detect Harmony & rewrite for SMAPI 3.12 (Harmony 1.x => 2.0 update)
|
// detect Harmony & rewrite for SMAPI 3.12 (Harmony 1.x => 2.0 update)
|
||||||
yield return new HarmonyRewriter();
|
yield return new HarmonyRewriter();
|
||||||
|
|
||||||
|
// detect issues for SMAPI 4.0.0
|
||||||
|
yield return new LegacyAssemblyFinder();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
yield return new HarmonyRewriter(shouldRewrite: false);
|
yield return new HarmonyRewriter(shouldRewrite: false);
|
||||||
|
|
|
@ -28,6 +28,9 @@
|
||||||
<PackageReference Include="Pintail" Version="2.1.0" />
|
<PackageReference Include="Pintail" Version="2.1.0" />
|
||||||
<PackageReference Include="Platonymous.TMXTile" Version="1.5.9" />
|
<PackageReference Include="Platonymous.TMXTile" Version="1.5.9" />
|
||||||
<PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
|
<PackageReference Include="System.Reflection.Emit" Version="4.7.0" />
|
||||||
|
|
||||||
|
<!-- legacy package; remove in SMAPI 4.0.0 -->
|
||||||
|
<PackageReference Include="System.Runtime.Caching" Version="5.0.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
Loading…
Reference in New Issue