focus-creative-games / hybridclr

HybridCLR是一个特性完整、零成本、高性能、低内存的Unity全平台原生c#热更新解决方案。 HybridCLR is a fully featured, zero-cost, high-performance, low-memory solution for Unity's all-platform native c# hotupdate.
https://code-philosophy.com/
MIT License
6.51k stars 656 forks source link

委托调用失败 #22

Closed AlanLiu90 closed 2 years ago

AlanLiu90 commented 2 years ago

下面的代码,在 Unity 2020.3.30 + Win64 的情况下,执行失败:

// 在 hybrid_trial 工程中测试
public class CreateByCode : MonoBehaviour
{
    public event Action<bool, int, int> OnTest;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("这个脚本是通过代码AddComponent直接创建的");

        OnTest += TestHandler;
        OnTest += TestHandler;

        FireTest(true, 0, 1);
    }

    private void TestHandler(bool arg1, int arg2, int arg3)
    {
        Debug.Log("Test");
    }

    public void FireTest(bool allChanged, int faction, int index)
    {
        if (OnTest != null)
            OnTest(allChanged, faction, index);
    }
}

期望输出:

Test
Test

实际输出:

ExecutionEngineException: NotSupportNative2Managed

如果 TestHandler 只注册一次,就没问题。

pirunxi commented 2 years ago

你生成桥接函数了吗?另外你确信这是最新版本吗?这个问题最新已经解决的。

AlanLiu90 commented 2 years ago

已经生成过了,用的是最新版本。

看了下代码,看起来是 CallDelegateInvoke_void 处理 delegates 不为空的分支中,没有处理方法需要解释执行的情况。

pirunxi commented 2 years ago

你有使用过补充元技术吗?

AlanLiu90 commented 2 years ago

有使用。我是在 hybridclr_trial 工程中测试的,只把 CreateByCode 的代码替换成上面的代码,就能复现这个问题。

pirunxi commented 2 years ago

已修复。非常感谢。这个问题发生在 Managed2Native桥接函数存在,但methodPointer未实现的的情况