C# Mono aot 与 protobuf-net 获取 ExecutionEngineException

     2023-04-12     6

关键词:

【中文标题】C# Mono aot 与 protobuf-net 获取 ExecutionEngineException【英文标题】:C# Mono aot with protobuf-net getting ExecutionEngineException 【发布时间】:2011-07-03 04:15:49 【问题描述】:

首先非常感谢 protobuf-net http://code.google.com/p/protobuf-net/ 的作者 Marc Gravell。这真是一个很棒的资源。无论如何,我希望 Marc 或其他人可以帮助我解决这个异常。

我正在尝试使用 Unity3D 游戏引擎在移动设备(iOS 和 Android)上实现 protobuf-net。 Unity 3.2 使用 Mono 2.6,这是对 mono 的略微修改版本。

它在编辑器中运行良好,但在 iOS 设备上运行时它会在它尝试序列化的第一个成员处失败。请注意异常中的 --aot-only 标志。我认为 Unity 基本上是通过 Mono 的 aot 功能构建 ARM 程序集,尽管我不明白它在后台做了什么。

ExecutionEngineException: Attempting to JIT compile method 'ProtoBuf.Property.Property`2<GameManagerSaveState , bool>:.ctor ()' while running with --aot-only.

at ProtoBuf.Property.PropertyBoolean`1[GameManagerSaveState]..ctor () [0x00000] in <filename unknown>:0 
at ProtoBuf.Property.PropertyFactory.CreateProperty[GameManagerSaveState] (System.Type type, ProtoBuf.DataFormat& format, MemberSerializationOptions options) [0x00000] in <filename unknown>:0 
at ProtoBuf.Property.PropertyFactory.Create[GameManagerSaveState] (System.Reflection.MemberInfo member) [0x00000] in <filename unknown>:0 
at ProtoBuf.Serializer`1[GameManagerSaveState].Build () [0x00000] in <filename unknown>:0

在 IRC 上建议我可以提前声明这些类型的变量,编译器不必在运行时对它们进行 JIT。似乎是个好主意,但不幸的是,这些就像内部泛型类型,并且不知道在 C# 中编写什么来声明变量以伪造编译器。任何人都可以解释上述消息并让我知道编译器需要提前知道什么吗?还有其他防止这种情况发生的策略吗?顺便说一句,这是错误的类的顶部

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using ProtoBuf;

[ProtoContract]
public class GameManagerSaveState

    [ProtoMember(1)]
    public bool gameOver;
      // snip

感谢 Mono 和 protobuf 专家帮助我解决这个问题! protobuf-net 似乎是一个很棒的轻量级序列化和 RPC 有线协议,非常适合 iOS 和 Android 应用程序,所以我很期待使用它。

【问题讨论】:

【参考方案1】:

v1 中有许多问题让预 JIT 有点痛苦; v2 虽然不完整,但旨在解决许多/所有这些问题,尤其是通过提供预编译到 dll 选项 - 但即使是仅运行时版本也应该更加对设备更友好。

我还应该提到,Jon 的 Java 版本移植在这里应该可以很好地工作,因为它是编译器重而不是运行时重。

【讨论】:

马克,好的,非常感谢。我正在使用 r282。是v1吗?我猜 v2 还没有发布,从你在网站上的笔记来看。我将研究 Java 移植版本,除非您可以将我指向 v2。 :) @Alex - v2 仅作为来自主干的代码提供; r282 是 v1 @Mark 好的,谢谢。顺便说一句,我用 Skeet 的 protobuf-csharp-port 做了一些测试。不幸的是,我得到 ExecutionEngineException: Attempting to JIT compile method 'System.Collections.Generic.GenericEqualityComparer`1:.ctor ()' while running with --aot-only. 所以我要从主干试试你的 v2。了解它还处于早期阶段,但它可能无法正常工作。再次感谢。 @Alex 记录在案,我已经在 emu 中工作了。如果您遇到困难,请告诉我,但我落后于 MonoDroid 测试版——当然,更新很容易。【参考方案2】:

在使用 protobuf 之前使用这个:

Environment.SetEnvironmentVariable("MONO_REFLECTION_SERIALIZER", "yes");

信用: https://github.com/antonholmquist/easy-serializer-unity

【讨论】:

mono的aot实现

...oli.com/about-il2cpp.htmlJIT方式:Unity的跨平台技术是通过一个Mono虚拟机实现的。而这个虚拟机更新太慢,不能很好地适应众多的平台。 AOT方式:unity公司就自行研发了IL2cpp,把本来应该再mono的虚拟机上跑的中间代码转换成cpp代... 查看详情

Mono 发行版中的 C# 编译器版本是不是与 Mono 版本相同?

】Mono发行版中的C#编译器版本是不是与Mono版本相同?【英文标题】:IstheC#compilerversioninaMonodistributionthesameastheMonoversion?Mono发行版中的C#编译器版本是否与Mono版本相同?【发布时间】:2019-09-1200:29:32【问题描述】:我想知道我加... 查看详情

.net7aot的使用以及.net与go互相调用(代码片段)

目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#和Golang互调C#调用GolangGolang调用C#其他背景其实,规划这篇文章有一段时间了,但是比较... 查看详情

如何在 C# 中检查代码是不是在 AOT 中运行?

】如何在C#中检查代码是不是在AOT中运行?【英文标题】:HowtocheckthecodeisrunninginAOTinC#?如何在C#中检查代码是否在AOT中运行?【发布时间】:2021-03-1509:52:07【问题描述】:我正在使用编译表达式来创建实例。由于回退过程,它在JI... 查看详情

Mono 和 C# IOCP:这是个好主意吗?

】Mono和C#IOCP:这是个好主意吗?【英文标题】:MonoandC#IOCP:Isitagoodidea?【发布时间】:2009-01-1620:47:47【问题描述】:我正在将一个c++应用程序移植到在其服务器上使用IOCP的c#。单声道可以像处理窗口一样处理IOCP吗?我会获得与c++... 查看详情

mono c# 获取应用程序路径

】monoc#获取应用程序路径【英文标题】:monoc#getapplicationpath【发布时间】:2011-09-0822:03:05【问题描述】:我正在寻找我的应用程序的目录,它似乎与常规c#不同?在Path.GetDirectoryName(Application.ExecutablePath)中不起作用。【问题讨论】... 查看详情

无法在 Mono 中编译 svcutil 生成的 C#

】无法在Mono中编译svcutil生成的C#【英文标题】:Cannotcompilesvcutil-generatedC#inMono【发布时间】:2013-11-0616:33:56【问题描述】:我要解决的根本问题是为什么我尝试使用的任何WSDL解析器(Perl、Python或Node.js)都不能为我尝试与之通信... 查看详情

如何在 Mono 上将 Linq 与 MySql 数据库一起使用?

】如何在Mono上将Linq与MySql数据库一起使用?【英文标题】:HowcanIuseLinqwithaMySqldatabaseonMono?【发布时间】:2010-09-0717:14:49【问题描述】:有许多库为与MySql数据库交互的C#代码提供Linq功能。其中哪一个在Mono上最稳定和可用?背景... 查看详情

C# mono 进程间、应用程序间跨平台消息传递实现。 (如何)

】C#mono进程间、应用程序间跨平台消息传递实现。(如何)【英文标题】:C#monointerprocess,interapplicationcrossplatformmessagingimplementation.(Howto)【发布时间】:2013-09-2703:49:27【问题描述】:我正在开发应用程序和c#,目前,我只从事Window... 查看详情

Mono c# 获取类

】Monoc#获取类【英文标题】:Monoc#Gettingtheclass【发布时间】:2020-04-0319:31:16【问题描述】:我正在尝试使用单声道和c++实例化一个类并调用c#类的函数。我的代码是:mono_config_parse(NULL);mono_set_assemblies_path("C:\\\\Users\\\\Oriorii\\\\Deskto... 查看详情

Mono c# 嵌入,mono_runtime_invoke 崩溃应用

】Monoc#嵌入,mono_runtime_invoke崩溃应用【英文标题】:Monoc#embedding,mono_runtime_invokecrashapp【发布时间】:2017-12-0203:41:46【问题描述】:我正在将Mono嵌入到我的c++应用程序中。我遇到了mono_runtime_invoke()的问题。这里是调用mono_runtime_in... 查看详情

将 mono 与嵌入它的 c++ 应用程序捆绑在一起

】将mono与嵌入它的c++应用程序捆绑在一起【英文标题】:Bundlingmonowithac++appthatembedsit【发布时间】:2013-05-1323:04:14【问题描述】:我创建了一个示例c++应用程序,它使用动态链接来嵌入单声道(如此处所述http://www.mono-project.com/Em... 查看详情

调试从 C++ 调用的 C# dll(嵌入 Mono)

】调试从C++调用的C#dll(嵌入Mono)【英文标题】:DebugaC#dllcalledfromC++(withMonoembedded)【发布时间】:2020-07-2119:22:53【问题描述】:我有一个用C++编写的运行时(嵌入了Mono),它使用mono_jit_exec和mono_runtime_invoke调用用C#编写的dll中的... 查看详情

在 Mono 中将 C++ 暴露给 C#:函数的无效转换?

】在Mono中将C++暴露给C#:函数的无效转换?【英文标题】:ExposingC++toC#inMono:invalidconversionoffunction?【发布时间】:2013-02-0222:40:44【问题描述】:我正在编写一个插件系统,将Mono嵌入到我的Windows的C++程序中。现在我正在尝试向C#运... 查看详情

Mono C# SQL 更新“并发冲突”

】MonoC#SQL更新“并发冲突”【英文标题】:MonoC#SQLUpdate"Concurrencyviolation"【发布时间】:2009-07-1015:24:22【问题描述】:每次我尝试通过Mono中的SqlDataAdapter.Update()更新一行时,我都会得到:未处理的异常:System.Data.DBConcurrency... 查看详情

c# DietPi下的Mono Cudafy运行失败

】c#DietPi下的MonoCudafy运行失败【英文标题】:c#MonoCudafyunderDietPifailedtorun【发布时间】:2020-01-3019:50:44【问题描述】:我在我的OdroidXU4上安装了DietPi,我安装了mono-runtime。我用c#做了一个简单的程序:usingSystem;usingCudafy;usingCudafy.Hos... 查看详情

如何使用 Mono 编译 Visual Studio C# 项目

】如何使用Mono编译VisualStudioC#项目【英文标题】:HowtocompileaVisualStudioC#ProjectwithMono【发布时间】:2012-01-0601:14:15【问题描述】:我是新手,不知道从哪里开始。我想在Linux上使用Mono编译VisualStudioC#项目(通过命令行)。main.cs文件... 查看详情

使用 Mono.Cecil 在 C# 程序集中注入方法

】使用Mono.Cecil在C#程序集中注入方法【英文标题】:InjectmethodinC#assemblywithMono.Cecil【发布时间】:2017-03-0220:36:14【问题描述】:我正在开发一些.Net应用程序,我需要使用我自己的代码在任何程序集中注入新方法。我正在使用Mono.C... 查看详情