Skip to content

Injected fields returning injected types cause a crash #97

Description

@simonkellly

If you do the following

[BepInAutoPlugin]
public partial class TestPluginPlugin : BasePlugin
{
    public override void Load()
    {
        ClassInjector.RegisterTypeInIl2Cpp<MyBehaviour>();
        ClassInjector.RegisterTypeInIl2Cpp<MyTestObj>();
        
        MyBehaviour myBehaviour = new GameObject().AddComponent(Il2CppType.Of<MyBehaviour>()).Cast<MyBehaviour>();
        MyTestObj myTestObj = new GameObject().AddComponent(Il2CppType.Of<MyTestObj>()).Cast<MyTestObj>();
        myTestObj.myBehaviour.Value = myBehaviour;

        MyTestObj myNewTest = Object.Instantiate(myTestObj).Cast<MyTestObj>();
        Log.LogMessage("myNewTest.myBehaviour.mySpriteRenderer: " + myNewTest.myBehaviour.Value);
    }
}

public class MyBehaviour : MonoBehaviour
{
    public MyBehaviour(IntPtr ptr) : base(ptr) { }
    
    public Il2CppReferenceField<GameObject> mySpriteRenderer;
}

public class MyTestObj : MonoBehaviour
{
    public MyTestObj(IntPtr ptr) : base(ptr) { }

    public Il2CppReferenceField<MyBehaviour > myBehaviour;
}

The game will crash once you call Object.Instantiate(myTestObj)

Though, if you switch the return type to be something more generic i.e MonoBehaviour in myBehaviour, it works fine

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions