Browse Source

Merge pull request #30501 from neikeq/dispose-godotsharpexport

Mono: Fix null dereference in EditorExportPlatformAndroid
Ignacio Roldán Etcheverry 6 năm trước cách đây
mục cha
commit
1700ab9bc6

+ 19 - 1
modules/mono/editor/GodotTools/GodotTools/GodotSharpEditor.cs

@@ -26,6 +26,8 @@ namespace GodotTools
         private MonoDevelopInstance monoDevelopInstance;
         private MonoDevelopInstance visualStudioForMacInstance;
 
+        private WeakReference<GodotSharpExport> exportPluginWeak;
+
         public MonoBottomPanel MonoBottomPanel { get; private set; }
 
         private bool CreateProjectSolution()
@@ -513,11 +515,27 @@ namespace GodotTools
             });
 
             // Export plugin
-            AddExportPlugin(new GodotSharpExport());
+            var exportPlugin = new GodotSharpExport();
+            AddExportPlugin(exportPlugin);
+            exportPluginWeak = new WeakReference<GodotSharpExport>(exportPlugin);
 
             GodotSharpBuilds.Initialize();
         }
 
+        protected override void Dispose(bool disposing)
+        {
+            base.Dispose(disposing);
+
+            if (exportPluginWeak.TryGetTarget(out var exportPlugin))
+            {
+                // We need to dispose our export plugin before the editor destroys EditorSettings.
+                // Otherwise, if the GC disposes it at a later time, EditorExportPlatformAndroid
+                // will be freed after EditorSettings already was, and its device polling thread
+                // will try to access the EditorSettings singleton, resulting in null dereferencing.
+                exportPlugin.Dispose();
+            }
+        }
+
         public void OnBeforeSerialize()
         {
         }