Mono 与 dotnet 运行时

问题描述 投票:0回答:1

根据 MS 消息来源,

https://learn.microsoft.com/en-us/xamarin/android/internals/architecture https://learn.microsoft.com/en-us/dotnet/maui/what-is-maui

Mono (https://github.com/mono/mono) 是用于 Xamarin.Forms 和 MAUI 的 runtime。与 dotnet 运行时相反:https://github.com/dotnet/runtime

因此,当我有一个由 API 和 Xamarin.Forms 应用程序组成的系统时,我有一个应用程序在 Windows 上的 dotnet 上运行(.NET 6 API 项目),另一个应用程序在 Android 上的 Mono 上运行(.Net Standard 2.0 Xamarin) .表格).

这些二进制文件的行为有何差异,因为它们在不同的运行时上运行?如果我有相同的类在两个项目上执行相同的操作,基于一个在 dotnet 上运行而另一个在 Mano 上运行的事实,是否会存在任何潜在的不同行为

作为示例,我参考了 Mono 文档的这一部分: https://www.mono-project.com/docs/advanced/runtime/docs/exception-handling/#exceptions-throw-programmatically-from-management -代码

这里,提到异常处理,它指出:

这些异常是使用“throw”从托管代码中抛出的,或者 “重新抛出”CIL 指令。 JIT 编译器会将它们翻译为 调用名为“mono_arch_throw/rethrow_exception”的辅助函数。

这些辅助函数在编译时并不存在,它们是被创建的 通过 excepts-.c 文件中的代码在运行时动态地执行。

它显式引用了一个函数 mono_arch_throw/rethrow_exception,该函数在编译时不存在,而是在运行时动态创建。这种行为就是我问题的本质所在。如果 Mono 在运行时创建该函数,我如何知道 dotnet 中的等效实现与 Mono 中发生的情况有何不同?作为移动应用程序开发人员,运行时差异对我有何影响?

android .net xamarin.android mono maui
1个回答
0
投票

简短回答“这些二进制文件的行为有何差异,因为它们在不同的运行时上运行?”

这取决于(取决于您的代码到底是什么以及它所依赖的 BCL 依赖项是什么)。

存在已知的不兼容性,但尚未完整记录。如果您观察到一些情况,那么您可能必须开发自己的解决方法,因为 Xamarin 平台即将被弃用。

长答案

不幸的是,这将是一堂历史课。

最开始的时候,有,

  • Mono CLR + Mono BCL,从2001.06到2014.11
  • .NET Framework CLR 和 .NET Framework BCL

在 Microsoft 将 .NET Framework 参考源文件完全开源后,Mono 开始集成它们。并且 .NET Core 也被添加到景观中,

  • Mono CLR + Mono BCL(包含许多.NET Framework BCL内容),自2014.11开始
  • .NET Framework CLR 和 .NET Framework BCL
  • .NET Core CLR 和 .NET Core BCL,自 2014.11 起

Microsoft/Xamarin 非常努力地保持 Mono BCL/.NET Framework BCL/.NET Core BCL 尽可能接近,但由于各种问题,这是不可能的。

Xamarin 产品从第一天起就完全基于 Mono CLR + Mono BCL,因此最终路线图确定这些产品将在 2024 年弃用。

所有 Xamarin 开发人员已收到迁移到 .NET MAUI 的通知,以便 MAUI 应用程序(以及您编写的其他 .NET 位)使用 .NET Core CLR + .NET Core BCL。

为了让这个答案简单,省略了更多细节。例如,Mono CLR 现在也是 .NET Core 的一部分,因此 .NET Core 有两个 CLR:CoreCLR 和 Mono CLR。这与这个问题不太相关。

参考文献

© www.soinside.com 2019 - 2024. All rights reserved.