Protobuf-net & IL2CPP - System.Reflection.Emit 不受支持
Protobuf-net & IL2CPP - System.Reflection.Emit is not supported
我对使用 IL2CPP 构建的 protobuf-net 和 Android 应用程序有疑问。
当我使用 MONO 而不是 IL2CPP 进行开发时,一切正常。现在我需要使用 IL2CPP 来支持 x64。我不知道 System.Reflection.Emit
不支持 IL2CPP 而 protobuf-net 正在使用它。
有没有办法让 protobuf-net 与 IL2CPP 一起工作?
我在 iOS 上遇到了同样的问题。你必须先编译ProtoModel。
using Assembly = UnityEditor.Compilation.Assembly;
private static void BuildMyProtoModel()
{
RuntimeTypeModel typeModel = TypeModel.Create();
foreach (var t in GetTypes(CompilationPipeline.GetAssemblies(AssembliesType.Player)))
{
var contract = t.GetCustomAttributes(typeof(ProtoContractAttribute), false);
if (contract.Length > 0)
{
MetaType metaType = typeModel.Add(t, true);
// support ISerializationCallbackReceiver
if (typeof(ISerializationCallbackReceiver).IsAssignableFrom(t))
{
MethodInfo beforeSerializeMethod = t.GetMethod("OnBeforeSerialize");
MethodInfo afterDeserializeMethod = t.GetMethod("OnAfterDeserialize");
metaType.SetCallbacks(beforeSerializeMethod, null, null, afterDeserializeMethod);
}
//add unity types
typeModel.Add(typeof(Vector2), false).Add("x", "y");
typeModel.Add(typeof(Vector3), false).Add("x", "y", "z");
}
}
typeModel.Compile("MyProtoModel", "MyProtoModel.dll"); //build model
string protoSchema = typeModel.GetSchema(null);//content for .proto file, you can generate a proto file for a specific type by passing it instead of null
}
private static IEnumerable<Type> GetTypes(IEnumerable<Assembly> assemblies)
{
foreach (Assembly assembly in assemblies)
{
foreach (Type type in AppDomain.CurrentDomain.Load(assembly.name).GetTypes())
{
yield return type;
}
}
}
将 MyProtoModel.dll 从根目录复制到插件文件夹。
并像这样使用:
TypeModel typeModel = new MyProtoModel();
我创建了一个小项目 Protobuf-net & Unity:
https://github.com/koshelevpavel/UniBufExample
https://github.com/koshelevpavel/UniBuf
但它只是实验性的,没有任何文档。
MonoBehaviour 小例子:
https://gist.github.com/koshelevpavel/8e2d62053fc79b2bf9e2105d18b056bc
我对使用 IL2CPP 构建的 protobuf-net 和 Android 应用程序有疑问。
当我使用 MONO 而不是 IL2CPP 进行开发时,一切正常。现在我需要使用 IL2CPP 来支持 x64。我不知道 System.Reflection.Emit
不支持 IL2CPP 而 protobuf-net 正在使用它。
有没有办法让 protobuf-net 与 IL2CPP 一起工作?
我在 iOS 上遇到了同样的问题。你必须先编译ProtoModel。
using Assembly = UnityEditor.Compilation.Assembly;
private static void BuildMyProtoModel()
{
RuntimeTypeModel typeModel = TypeModel.Create();
foreach (var t in GetTypes(CompilationPipeline.GetAssemblies(AssembliesType.Player)))
{
var contract = t.GetCustomAttributes(typeof(ProtoContractAttribute), false);
if (contract.Length > 0)
{
MetaType metaType = typeModel.Add(t, true);
// support ISerializationCallbackReceiver
if (typeof(ISerializationCallbackReceiver).IsAssignableFrom(t))
{
MethodInfo beforeSerializeMethod = t.GetMethod("OnBeforeSerialize");
MethodInfo afterDeserializeMethod = t.GetMethod("OnAfterDeserialize");
metaType.SetCallbacks(beforeSerializeMethod, null, null, afterDeserializeMethod);
}
//add unity types
typeModel.Add(typeof(Vector2), false).Add("x", "y");
typeModel.Add(typeof(Vector3), false).Add("x", "y", "z");
}
}
typeModel.Compile("MyProtoModel", "MyProtoModel.dll"); //build model
string protoSchema = typeModel.GetSchema(null);//content for .proto file, you can generate a proto file for a specific type by passing it instead of null
}
private static IEnumerable<Type> GetTypes(IEnumerable<Assembly> assemblies)
{
foreach (Assembly assembly in assemblies)
{
foreach (Type type in AppDomain.CurrentDomain.Load(assembly.name).GetTypes())
{
yield return type;
}
}
}
将 MyProtoModel.dll 从根目录复制到插件文件夹。 并像这样使用:
TypeModel typeModel = new MyProtoModel();
我创建了一个小项目 Protobuf-net & Unity:
https://github.com/koshelevpavel/UniBufExample
https://github.com/koshelevpavel/UniBuf
但它只是实验性的,没有任何文档。
MonoBehaviour 小例子:
https://gist.github.com/koshelevpavel/8e2d62053fc79b2bf9e2105d18b056bc