根据 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 中发生的情况有何不同?作为移动应用程序开发人员,运行时差异对我有何影响?
这取决于(取决于您的代码到底是什么以及它所依赖的 BCL 依赖项是什么)。
存在已知的不兼容性,但尚未完整记录。如果您观察到一些情况,那么您可能必须开发自己的解决方法,因为 Xamarin 平台即将被弃用。
不幸的是,这将是一堂历史课。
最开始的时候,有,
在 Microsoft 将 .NET Framework 参考源文件完全开源后,Mono 开始集成它们。并且 .NET Core 也被添加到景观中,
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。这与这个问题不太相关。