我正在尝试通过 Mono Debugger Wire Protocol 控制 Unity Editor。我想获得
public static
property 的价值。
以下是片段:
using VirtualMachine = Mono.Debugger.Soft.VirtualMachine;
// vm points to the virtual machine of the Unity Editor
internal void SomeWhat(VirtualMachine vm) {
var hierarchyWindow = vm.GetTypes("UnityEditor.SceneHierarchyWindow", false)!.Single()!;
var prev = hierarchyWindow.GetMethod("SelectPrevious")!;
var latestWindow = hierarchyWindow
.GetProperty("lastInteractedHierarchyWindow")
.GetGetMethod(false)
.Evaluate(null, new Value[] { });
prev.Evaluate(latestWindow, new Value[] {});
}
但是,它会抛出
System.NotSupportedException
:
Unhandled exception. System.NotSupportedException: Specified method is not supported.
at Mono.Debugger.Soft.ILInterpreter.Evaluate(Value this_val, Value[] args) in $PROJECT/deps/debugger-libs/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs:line 43
at Mono.Debugger.Soft.MethodMirror.Evaluate(Value this_val, Value[] args) in $PROJECT/deps/debugger-libs/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs:line 466
at Blah.SomeWhat(VirtualMachine vm) in $PROJECT/$PROJECT_NAME/SandBox/Lib.cs:line $LINE
其中
$PROJECT
、$PROJECT_NAME
和 $LINE
是可变的。
我很困惑,因为它的消息很差,并且 Java 反射中的静态 字段 不需要有效的
this_val
对象。事实证明,目前this_val
不能为空。
我正在使用 Unity Editor 2019.4.31f1 和 mono/debugger-libs https://github.com/mono/debugger-libs/tree/6fcc6d78446b1fffac12f597099cc3d78dd74ca6,有什么想法吗?
ILInterpreter
中的第42行确实检查
if (method.IsStatic || ... || this_val == null || ...) throw new NotSupportedException ();
所以看起来这样——或者至少这样——根本不是为静态而设计的。
因为在这种特定情况下,该属性实际上只是指向静态字段
私有静态SceneHierarchyWindow s_LastInteractedHierarchy;
你可以尝试尝试一下,例如
var fieldInfoMirror = hierarchyWindow.GetField("s_LastInteractedHierarchy");
var latestWindow = hierarchyWindow.GetValue(fieldInfoMirror);