瀏覽代碼

Merge pull request #72205 from raulsntos/dotnet/proxy-class

Fix lookup of C# types by their engine name
Rémi Verschelde 2 年之前
父節點
當前提交
80f59aa3d9
共有 1 個文件被更改,包括 27 次插入3 次删除
  1. 27 3
      modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs

+ 27 - 3
modules/mono/glue/GodotSharp/GodotSharp/Core/Bridge/ScriptManagerBridge.cs

@@ -243,9 +243,33 @@ namespace Godot.Bridge
 
             if (wrapperType == null)
             {
-                wrapperType = AppDomain.CurrentDomain.GetAssemblies()
-                    .FirstOrDefault(a => a.GetName().Name == "GodotSharpEditor")?
-                    .GetType("Godot." + nativeTypeNameStr);
+                wrapperType = GetTypeByGodotClassAttr(typeof(GodotObject).Assembly, nativeTypeNameStr);
+            }
+
+            if (wrapperType == null)
+            {
+                var editorAssembly = AppDomain.CurrentDomain.GetAssemblies()
+                    .FirstOrDefault(a => a.GetName().Name == "GodotSharpEditor");
+                wrapperType = editorAssembly?.GetType("Godot." + nativeTypeNameStr);
+
+                if (wrapperType == null)
+                {
+                    wrapperType = GetTypeByGodotClassAttr(editorAssembly, nativeTypeNameStr);
+                }
+            }
+
+            static Type? GetTypeByGodotClassAttr(Assembly assembly, string nativeTypeNameStr)
+            {
+                var types = assembly.GetTypes();
+                foreach (var type in types)
+                {
+                    var attr = type.GetCustomAttribute<GodotClassNameAttribute>();
+                    if (attr?.Name == nativeTypeNameStr)
+                    {
+                        return type;
+                    }
+                }
+                return null;
             }
 
             static bool IsStatic(Type type) => type.IsAbstract && type.IsSealed;