反射没有看到字段

问题描述 投票:0回答:1

我在 il2cpp 游戏上有 melonloader,并尝试为它编写 mod。

我需要从

Joint.massScale
获取字段
il2cppSystem.Object
作为
ConfigurableJoint : Joint
对象。

该字段存在于

UnityExplorer
中: enter image description here

并且可以直接使用: enter image description here

失败之处:

.GetMember
.GetMembers
:它们只是不包含该字段/属性

MemberInfo member = anyObject.GetIl2CppType()
    .GetMember(requested, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)
    .First();

递归

GetMember

static IEnumerable<MemberInfo> GetAllMembersRecursivly(Il2CppSystem.Type type) =>
    type.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)
    .Concat(type.BaseType == Il2CppType.Of<Il2CppSystem.Object>() ? new MemberInfo[0] : GetAllMembersRecursivly(type.BaseType));

同样的结果

也许???

我发现的唯一解决方法是像这样硬编码该类型:

if (cj != null && requested == "massScale" && !path.Any())
{
    return ((v) => cj.massScale = v.Unbox<float>(), Il2CppType.Of<float>());
}

但是……嗯

更多信息:

我做了一些调试并输出类型及其子类型的所有字段:

base type: UnityEngine.ConfigurableJoint
fields:
set_targetPosition
set_xDrive
set_yDrive
set_zDrive
set_targetRotation
set_rotationDriveMode
set_slerpDrive
set_targetPosition_Injected
set_xDrive_Injected
set_yDrive_Injected
set_zDrive_Injected
set_targetRotation_Injected
set_slerpDrive_Injected
targetPosition
xDrive
yDrive
zDrive
targetRotation
rotationDriveMode
slerpDrive


base type: UnityEngine.Joint
fields:
get_connectedBody
set_connectedBody
set_axis
get_anchor
set_anchor
get_connectedAnchor
set_connectedAnchor
set_autoConfigureConnectedAnchor
set_enableCollision
set_enablePreprocessing
set_axis_Injected
get_anchor_Injected
set_anchor_Injected
get_connectedAnchor_Injected
set_connectedAnchor_Injected
connectedBody
axis
anchor
connectedAnchor
autoConfigureConnectedAnchor
enableCollision
enablePreprocessing

标志:

BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Declared
每个子类型

c# unity-game-engine reflection il2cpp
1个回答
0
投票

你需要展示你想要使用Reflection挖掘的类型的确切定义,但我可以告诉你导致成员信息丢失的最典型的错误以及克服它们的方法。

  • 要启动它,请使用
    System.Type.GetMembers
    而不是
    System.Type.GetMember
    ,遍历所有成员的数组,并尝试找出缺少的内容。几乎在所有情况下,它都有助于解决您的问题。
  • 更一般地说,你几乎从不需要
    System.Type.GetMember
    。问题是第一个参数是
    string
    ,但是你怎么知道你提供了正确的名称并且你不是简单地犯了一个拼写错误?你的
    requested
    从哪里来? (这里给你一个提示:
    nameof
    )。如果您回答这个问题并且有兴趣了解如何在没有
    System.Type.GetMember
    和字符串的情况下进行操作,我很可能能够为您建议正确的技术。
  • 另一个典型的错误是错误的
    BindingFlags
    值。首先,您需要使用我的第一个建议来了解您的会员的正确特征是什么。更清晰的方法是:从以下值开始:
    BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static
    。就是这样,没有别的了。
© www.soinside.com 2019 - 2024. All rights reserved.