Fix Roslyn compiler missing netstandard/System.Runtime references (CS0012)

Add netstandard.dll and System.Runtime.dll as metadata references in both
the self-contained and non-self-contained compilation paths. These facade
assemblies are required when scripts reference libraries targeting
netstandard (e.g. Brigadier.NET), preventing CS0012 errors like:
"The type 'Object' is defined in an assembly that is not referenced."

Also make the self-contained path resilient to missing facade assemblies
by catching FileNotFoundException instead of throwing.

Co-authored-by: milutinke <441903+milutinke@users.noreply.github.com>
Agent-Logs-Url: https://github.com/MCCTeam/Minecraft-Console-Client/sessions/d34fe951-43e5-412d-8d7f-cf9bee3a0d77
This commit is contained in:
copilot-swe-agent[bot] 2026-03-24 18:10:04 +00:00
parent 54e07cd233
commit da3b2de2ce

View file

@ -129,9 +129,22 @@ namespace MinecraftClient.Scripting.DynamicRun.Builder
var assemblyrefs = Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList()!; var assemblyrefs = Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList()!;
assemblyrefs.Add(new("MinecraftClient")); assemblyrefs.Add(new("MinecraftClient"));
assemblyrefs.Add(new("System.Private.CoreLib")); assemblyrefs.Add(new("System.Private.CoreLib"));
// Facade assemblies needed for compiling scripts that reference netstandard libraries (e.g. Brigadier.NET)
assemblyrefs.Add(new("netstandard"));
assemblyrefs.Add(new("System.Runtime"));
foreach (var refs in assemblyrefs) { foreach (var refs in assemblyrefs) {
var loadedAssembly = Assembly.Load(refs); Assembly? loadedAssembly;
try
{
loadedAssembly = Assembly.Load(refs);
}
catch (FileNotFoundException)
{
// Facade assemblies like netstandard may not be loadable in all environments
continue;
}
if (string.IsNullOrEmpty(loadedAssembly.Location)) { if (string.IsNullOrEmpty(loadedAssembly.Location)) {
// Check if we can access the file from the executable. // Check if we can access the file from the executable.
var reference = files.FirstOrDefault(x => var reference = files.FirstOrDefault(x =>
@ -145,8 +158,8 @@ namespace MinecraftClient.Scripting.DynamicRun.Builder
} }
if (reference is null) { if (reference is null) {
throw new InvalidOperationException( // Facade assemblies may not be in the bundle - skip them silently
"[Script Error] The executable does not contain a referenced assembly. Assembly name: " + refs.Name); continue;
} }
assemblyStream = reference.AsStream(); assemblyStream = reference.AsStream();
@ -163,6 +176,16 @@ namespace MinecraftClient.Scripting.DynamicRun.Builder
references.Add(MetadataReference.CreateFromFile(SystemConsole)); references.Add(MetadataReference.CreateFromFile(SystemConsole));
references.Add(MetadataReference.CreateFromFile(MinecraftClientDll)); references.Add(MetadataReference.CreateFromFile(MinecraftClientDll));
Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList().ForEach(a => references.Add(MetadataReference.CreateFromFile(Assembly.Load(a).Location))); Assembly.GetEntryAssembly()?.GetReferencedAssemblies().ToList().ForEach(a => references.Add(MetadataReference.CreateFromFile(Assembly.Load(a).Location)));
// Add facade assemblies needed for Roslyn compilation when referencing
// libraries that target netstandard (e.g. Brigadier.NET).
var runtimeDir = Path.GetDirectoryName(SystemPrivateCoreLib)!;
foreach (var facadeName in new[] { "netstandard.dll", "System.Runtime.dll" })
{
var facadePath = Path.Combine(runtimeDir, facadeName);
if (File.Exists(facadePath))
references.Add(MetadataReference.CreateFromFile(facadePath));
}
} }
#pragma warning restore IL3000 #pragma warning restore IL3000