loongly / PureScript

A C# hot reload framework for Unity3D, based on Mono's MONO_AOT_MODE_INTERP mode.
MIT License
270 stars 47 forks source link

windows平台跑Demo的时候会出问题 #2

Closed quicklyslow closed 3 years ago

quicklyslow commented 3 years ago

今天一直在尝试,打了个windows下的il2cpp来测试,遇到了很多dll相关的主要是路径的问题,最后到了这里返回的res是-1,然后就不能继续下去了 image 按照我的理解,从ScriptEngine.Setup调用SetupMono启动TestEntry.dll这里应该是对应了intepreter模式的入口调用,应该是比较关键的地方。 接下来我只能用调试mono的方式来看为什么调用出错了。如果仓库主能完善一下文档追加一些原理和问题的faq,再来一个可复现的demo就好了。

loongly commented 3 years ago

嗯,这里返回-1说明函数已经执行完,但是报了异常,非正常退出,异常信息会存在exc内(也就是c#的Exception对象),跟进后面check_mono_exception内会有详细的信息和堆栈,如果方便可以把这些信息发下。

这种情况往往是dll依赖没有加载成功,也可能是绑定代码不匹配,导致调用接口时抛异常,绑定代码会在导出工程时重新生成,Unity版本也提供下,我这调试下看看。

另外文档我会抽空完善下,因为最近在换工作,所以这边耽误了,抱歉。

quicklyslow commented 3 years ago

dll依赖说的是ScriptEngine.dll依赖mono-2.0-sgen.dll吧,这个开始也让我找了一段时间,后来用depends查了之后把mono-2.0-sgen.dll拷到ScriptEngine.dll的目录就行了。然后在找不到依赖时我还尝试了用ScriptEngine.dll静态链接libmono-static-sgen.lib也就不用依赖mono-2.0-sgen.dll,两种方式我都试过了。 然后还是会报错: output_log.txt 看上去是调用到Adapter.wrapper.dll里的这句: Type type = assembly.GetType("MonoEntry"); MethodInfo mi = type.GetMethod("Main"); 时报的错,但是原因不明。 另外windows下能用interpret模式跑mono测试吗?我看现在还是用的jit,iOS的设置似乎也不能直接用到windows上。

Unity用的是2018.4.15

loongly commented 3 years ago

感谢反馈并认真排查问题, @quicklyslow已经排查到了问题原因: 是因为 https://github.com/mono/mono/commit/4a15e73429d5ac994ff7cd183c14bbce92806e6b 这个修改里面改了 StringToUtf8 对应的 c 实现和绑定,但是修改了 SafeStringMarshal.cs 之后, 如果对应的 mscorlib.dll 不修改的话,函数调用就对不上,于是就异常了。 目前已解决: mono版本和mscorlib.dll有绑定关系,按Unity的习惯最好固定一个Mono版本和mscorlib.dll,后续如需升级mono,待测试过没问题再提交到此项目中,目前 mono-2.0-sgen.lib 已提交到ScriptEngine\lib目录 mono-2.0-sgen.dll 已提交到DemoProject * Plugins\PureScript\x86_64 目录