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.63k stars 675 forks source link

升级到3.1.1后,报 Could not load type from assembly的错误 #73

Closed pencil-song closed 1 year ago

pencil-song commented 1 year ago

在调用 LoadMetadataForAOTAssembly后,使用LoadAssembly依次加载热更程序集时出现 TypeLoadException: Could not load type 'SeekList`2' from assembly 'mscorlib 的错误, 奇怪的是这是一个热更程序集中并没有被用到的类 定义如下:

public class SeekList<TK, TV> : IDictionary<TK, TV>, IReadOnlyDictionary<TK, TV> where TK : notnull
{
        TK[] _arr;
        readonly Dictionary<TK, TV> _dic;
        readonly IComparer<TK> _comparer;
        int _size;

        public SeekList(int capacity = 4, IComparer<TK> comparer = null)
        {
            _arr = new TK[capacity];
            _dic = new Dictionary<TK, TV>(capacity);
            _comparer = comparer ?? Comparer<TK>.Default;
            _size = 0;
        }
}

我尝试在主程序集中添加了Dictionary的相关的调用,link.xml也添加了Dictionary还是无法解决,回退到老版本2.1.0就可以

pirunxi commented 1 year ago

这个问题有其他开发者反馈过,但不确定是否和你是同一个原因,能否断点到抛出异常时的cpp代码,把堆栈截图发出来

pirunxi commented 1 year ago

请提供信息给我们,才能快速解决

pencil-song commented 1 year ago

麻烦下看

断点的执行路径是: image

在resolve_parse_info_internal,需要返回kclass,整个函数走完也没有找到它,然后返回NULL导致的异常

pirunxi commented 1 year ago

已解决,升级到3.2.0

pencil-song commented 1 year ago

升级后,还是存在这问题

pencil-song commented 1 year ago

hybridclr_trial-main.zip

麻烦有空看看,使用的测试工程升级到3.2.0,在hotUpdate程序集中,添加了对应的类型,打包出来后,会有上面反馈的错误

pirunxi commented 1 year ago

验证确实有bug。不过原因在于3.x版本起调用了il2cpp TypeNameParser,它的实现实现有bug。我们已修复,下个版本会放出。

pencil-song commented 1 year ago

好的好的,辛苦了