MAUI 和 Uno 平台有啥区别?

Posted

技术标签:

【中文标题】MAUI 和 Uno 平台有啥区别?【英文标题】:What is the difference between MAUI and Uno Platform?MAUI 和 Uno 平台有什么区别? 【发布时间】:2021-03-16 06:35:06 【问题描述】:

我有点困惑。任何人都可以准确解释两者之间的区别吗?我们什么时候应该使用 MAUI,什么时候应该使用 UNO? 我意识到,两者都可以在不同的平台上运行,那么同时引入两种不同技术的原因是什么?它们可以在 Windows 7 上运行吗?还是它们仅限于 Windows 10?我的 WPF 程序可以在使用这两种技术的 Linux 上运行吗?

【问题讨论】:

我不会说它们是同时发布的,我相信Uno Platform已经存在了一段时间,但MAUI的目标是明年11月(2021年)GA。它们是不同“人”为了本质上做同样的事情而做出的两种不同的努力。 您的 WPF 无法在使用任何这些技术的 Linux 上运行。如果您将 WPF 应用程序移植到 UWP,然后使用 UNO,则可以。但是,不完整。 MAUI 尚未发布,但是,当它发布时,您必须将 WPF 移植到 MAUI。 WPF 现在是一个死胡同,它不能在 Windows 以外的任何平台上运行,开箱即用。 【参考方案1】:

我已经使用 Xamarin.Forms(将更名为 MAUI)开发了 5 年多,并且使用 Uno Platform 开发了快四个月。对我来说,有许多不同之处让我值得花时间从 Xamarin.Forms 迁移到 Uno。一、相似之处:

两者都是 C# 跨平台框架 两者都支持 XAML 两者都通过非 .Forms Xamarin 平台框架支持 iosandroid、通用 Windows 平台和(在较小程度上)Mac OS。 Xamarin.Essentials 可在上述平台上与 Xamarin 和 Uno 一起使用 两者都没有对打印、PDF 生成或 PNG 生成的内置支持。

现在的区别:

在架构上,Xamarin.Forms 是它自己的位于本机 API 之上的抽象层,因为 Uno 在本机 API 上构建 UWP 接口。在我看来,这是最重要的区别,原因有以下三个: 在 Android 中,Xamarin.Forms 抽象包括测量和布局管理。这是非常昂贵的,而且对于除了最简单的列表视图之外的所有视图,都会导致性能非常差。相比之下,Uno 在本机层执行此操作 - 从而避免在 Java 和 C# 之间来回传递。 在 WASM 中,Xamarin 通过 Blazor 呈现 - 它支持混合服务器/客户端应用程序。不幸的是,与 Uno 采用的方法相比,这增加了复杂性。 Xamarin 方法是否会降低性能还有待观察。 由于 Uno 在原生 UI 框架上构建 UWP,因此打开封面并在功能上进行深度更改非常简单。在 Xamarin.Forms 中执行此操作要困难得多(如果在某些情况下不是不可能的话)。 Uno 对 WPF(所以是的,它可以在 Windows 7 中运行)、Tizen 和 Linux (GTK) 提供强大的支持。 Uno 支持 UWP XAML 的复杂性 - 如果您有 WPF 或 UWP 经验,那么它具有一些主要优势。否则,它会在你身上消失,就像在我身上一样。我希望能改变这一点。 Uno 支持 WinUI 和 Windows Community Toolkit 库。 虽然我不能确定这一点,但我相信 Xamarin.Forms 的存在时间比 Uno Platform 长了大约 2-3 年。话虽如此,Uno 在功能和代码质量方面已迅速赶上 Xamarin。我相信这部分是因为 UWP 作为非常成熟的操作规范。 根据我将大约 132k 行 Xamarin.Forms 代码的项目迁移到 Uno 的经验,Uno 的冗长性明显降低,大约为 65k 行。几乎所有这些减少都在 UI 代码行中(模型、视图模型和业务逻辑几乎没有受到影响)。这主要是因为 UWP (Uno) 控件可以提供更多功能丰富的控件。

最后,您询问您的 WPF 程序是否可以使用这两种技术在 Linux 上运行。答案是

Xamarin.Forms:不。不支持 Linux; Uno Platform:否,但可以迁移您的代码。所做的工作与将您的程序从 WPF 移植到 UWP 大致相同。

您的里程可能会有所不同。但是,如果您有 WPF 或 UWP 方面的经验,我强烈推荐 Uno。如果您都没有这方面的经验,那么我会推荐 Uno,因为它在 Android 上具有卓越的性能。

【讨论】:

你能从UNO访问本机api吗?就像 xamarin.native 如何公开所有 api 一样? 是的......而且它比在 Xamarin 中要容易得多。在 Xamarin 中,访问本机层非常痛苦 - 有六种方法可以做到这一点,但没有一种是直截了当的。在 UNO 中,因为您的项目是多目标的(MAUI 的发展方向),所以您总是在处理 UNO/UWP 抽象的同时在本机层工作。您嵌入平台特定代码(使用#if 编译器指令)。此外,只需稍作检查(通过调试器或查看源代码)即可获得 UNO/UWP 抽象背后的本机视图元素。 这应该是 MAUI vs Uno,而不是 Xamarin.Forms vs Uno。 同意,保罗。记下发布日期。当时,没有可用于评估的 MAUI 版本,因此比较存在的两件事情与一件存在的事情和一件不存在的事情是合理的。现在 MAUI 有一个粗略的(很多缺失的元素)初步版本,我们可以看到它确实具有 UNO 中看到的共享项目的一些好处,但仍然保留了 View Renderer 设计模式(NSConsistancy 异常的来源)。另请注意,OP 询问了对 WPF 的支持 - 并且(此时)MAUI 支持的唯一平台是 iOS 和 Android。【参考方案2】:

另一种观点是,此时您只能将 UNO 与 Xamarin.Forms 今天所做的进行比较。如果您是 MAUI 团队的成员,那么您应该照亮道路,但我不是。你真的不知道为了提高性能而进行了哪些结构更改,最近微软非常重视性能 - 所以我猜他们肯定会在 Java/C# 的鸿沟上努力工作。

要考虑的另一件事是 MAUI 是 Microsoft API,UNO 不是(现在) Wo 知道将来,Microsoft 倾向于购买他们喜欢并符合愿景的技术。

如果您现在需要跨平台开发,您正在比较现在可用的 UNO 和 Xamarin.Forms。如果不延迟,MAUI 将在 2021 年宣布。

现在回答您真正的问题:您现在可以使用 .NET Core 在 linux 上运行 WPF,您无需等待 MAUI 或退出 Microsoft API。

【讨论】:

我不认为最后的说法是正确的。您现在无法在 .NET Core 上的 Linux 上运行 WPF。您可以在 Linux 上运行 .NET Core,但不能在 WPF 上运行。 WPF 与 DirectX 密不可分,因此不能在 Linux 上运行。 不,您现在无法使用 .NET Core 在 Linux 上运行 WPF。 WPF 不能在 Windows 以外的任何操作系统上运行,除非我缺少一些虚拟机类型层技术。【参考方案3】:

Uno 团队也在文档中讨论了这个问题 - https://platform.uno/docs/articles/intro.html#how-is-uno-platform-different-from-net-maui

Uno Platform 应用程序是跨平台的,可通过单一代码库在 Web 以及移动设备和桌面设备上运行。 Blazor 是 ASP.NET 的一项功能,主要用于构建 Web 应用程序。

Uno Platform 应用程序是用 C# 和 XAML 标记编写的,而 Blazor 应用程序是用“Razor”语法编写的,它是 HTML/CSS 和 C# 的混合体。

Uno Platform 和 Blazor 都利用 .NET 的 WebAssembly 支持在浏览器中本地运行。

【讨论】:

请为任何链接添加上下文,以便您的答案是独立的,这意味着答案需要在答案本身中。见"Provide context for links"。如果您可以在此处用自己的话回答问题并仅作为参考链接,那将是更好的选择。 Uno Platform 应用程序是跨平台的,可通过单一代码库在 Web 以及移动设备和桌面上运行。 Blazor 是 ASP.NET 的一项功能,主要用于构建 Web 应用程序。 Uno 平台应用程序是用 C# 和 XAML 标记编写的,而 Blazor 应用程序是用“Razor”语法编写的,它是 HTML/CSS 和 C# 的混合体。 Uno Platform 和 Blazor 都利用 .NET 的 WebAssembly 支持在浏览器中本地运行。 我明白了。由于这是直接引用,因此您应该为此使用标记,因此很明显它是引用而不是您自己的话。我相信您可以标记整个文本并单击引号图标或在文本中添加>。编辑时单击右侧的问号,将为您提供更多帮助。请参阅highlighted areas。我要补充一点,How to reference material written by others 要求“不要复制外部资源的完整文本;相反,用他们的文字和想法来支持你自己的。”

以上是关于MAUI 和 Uno 平台有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

什么是毛伊? MAUI 和 Xamarin 有什么区别

arduino leonardo 和arduino uni有啥区别吗?

SQL和MySQL有啥区别?

OpenID 和 OAuth 有啥区别

气流和 Kubeflow 管道有啥区别?

IND和NAN号有啥区别