Browse Source

C#: Set AppContext.BaseDirectory for editor builds

RedworkDE 2 years ago
parent
commit
b9d1462d2a
1 changed files with 20 additions and 0 deletions
  1. 20 0
      modules/mono/glue/GodotSharp/GodotPlugins/PluginLoadContext.cs

+ 20 - 0
modules/mono/glue/GodotSharp/GodotPlugins/PluginLoadContext.cs

@@ -21,6 +21,26 @@ namespace GodotPlugins
             _resolver = new AssemblyDependencyResolver(pluginPath);
             _sharedAssemblies = sharedAssemblies;
             _mainLoadContext = mainLoadContext;
+
+            if (string.IsNullOrEmpty(AppContext.BaseDirectory))
+            {
+                // See https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/System.Private.CoreLib/src/System/AppContext.AnyOS.cs#L17-L35
+                // but Assembly.Location is unavailable, because we load assemblies from memory.
+                string? baseDirectory = Path.GetDirectoryName(pluginPath);
+                if (baseDirectory != null)
+                {
+                    if (!Path.EndsInDirectorySeparator(baseDirectory))
+                        baseDirectory += Path.PathSeparator;
+                    // This SetData call effectively sets AppContext.BaseDirectory
+                    // See https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/System.Private.CoreLib/src/System/AppContext.cs#L21-L25
+                    AppDomain.CurrentDomain.SetData("APP_CONTEXT_BASE_DIRECTORY", baseDirectory);
+                }
+                else
+                {
+                    // TODO: How to log from GodotPlugins? (delegate pointer?)
+                    Console.Error.WriteLine("Failed to set AppContext.BaseDirectory. Dynamic loading of libraries may fail.");
+                }
+            }
         }
 
         protected override Assembly? Load(AssemblyName assemblyName)