当前位置 : 主页 > 大数据 > 区块链 >

IlRuntime + protobuf-net

来源:互联网 收集:自由互联 发布时间:2021-06-22
环境unity566,.net2.0 下载protobuf-net https://github.com/mgravell/protobuf-net/tree/r668 因为这个vs2015就可以打开,主干需要2017 下载ILRuntime https://github.com/Ourpalm/ILRuntime 参照 https://github.com/Ourpalm/ILRunti

环境unity566,.net2.0

下载protobuf-net

https://github.com/mgravell/protobuf-net/tree/r668

因为这个vs2015就可以打开,主干需要2017

下载ILRuntime

https://github.com/Ourpalm/ILRuntime

参照

https://github.com/Ourpalm/ILRuntimeU3D/

搭建1个hotfix工程,1个unity工程,完整工程如下

https://github.com/yingsz/ILRuntime-protobuf-net

遇到的几个问题

1对于hotfix工程里,继承外部类或接口,需要编写adaptor,并注册,网上有教程

2对于hotfix工程不可以既继承外部类,同时又实现外部接口。ProtoMemberAttribute既继承了Attribute,又实现了ICompare.

这个时候需要在外部实现1个类,继承Attribute。并实现接口ICompare,比如叫CompareAttribute,然后ProtoMemberAttribute继续CompareAttribute

但是我简单粗暴的把ICompare删了

3ILRuntime里抛nullreferenceexception,这个是因为protobuf生成文件里

global::ProtoBuf.IExtension global::ProtoBuf.IExtensible.GetExtensionObject(bool createIfMissing)
{ return global::ProtoBuf.Extensible.GetExtensionObject(ref extensionObject, createIfMissing); }

 

获取方法名字是“global::ProtoBuf.IExtensible.GetExtensionObject”,而ILRuntime里用名字找方法是用的是

  if (m == null && method.DeclearingType.IsInterface)
            {
                m = GetMethod(string.Format("{0}.{1}", method.DeclearingType.FullName, method.Name), method.Parameters, genericArguments, method.ReturnType, true);

名字是“ProtoBuf.IExtensible.GetExtensionObject”,所以会找不到方法,所以需要改成

var m = GetMethod(method.Name, method.Parameters, genericArguments, method.ReturnType, true);
            if (m == null && method.DeclearingType.IsInterface)
            {
                m = GetMethod(string.Format("{0}.{1}", method.DeclearingType.FullName, method.Name), method.Parameters, genericArguments, method.ReturnType, true);
                if(m == null)
                    m = GetMethod(string.Format("global::{0}.{1}", method.DeclearingType.FullName, method.Name), method.Parameters, genericArguments, method.ReturnType, true);
            }
网友评论