【问题标题】:Is it possible to create a Mono bundle that includes WPF libraries?是否可以创建包含 WPF 库的 Mono 包?
【发布时间】:2011-02-27 01:28:03
【问题描述】:

我知道 WPF 库不是由 mono 类库实现的,但是(据我所知)mono 2.6 运行时与 .NET 2.0/3.5 运行时完全兼容,所以如果 WPF 库只进行 PInvoke 调用windows api 理论上可以使用单声道运行时在 windows 上运行 wpf 应用程序。 想要将 wpf 应用程序部署为 Windows 的独立可执行文件的原因。有没有人尝试过这样的事情?如果有,结果如何?

【问题讨论】:

  • Windows Vista 和 Windows 7 与 .NET 2.0 和 3.0 一起开箱即用。因此,如果您不想告诉您的客户他们需要安装 .NET 框架,那么仅针对其中一个版本可能比使用单机独立应用程序要简单得多。

标签: c# .net wpf mono bundle


【解决方案1】:

总之...不

At this point, the Mono project does not have plans to implement Windows Presentation Foundation APIs as part of the project

Mono 提供Moonlight 支持,据我了解,它还将使用XAML 的一个子集来创建其UI (the same as Silverlight does),但也有legal complications involved。比如,它仅限于非微软和非mac平台。

如果您想查找 WPF/XAML 的开源跨平台替代方案列表,我正在努力 compile a list of viable alternatives

【讨论】:

  • 正如我在最后两个答案中已经说过的,我不是在问 mono 是否有等效的 WPF 库实现,我知道它没有。我问的是是否有人尝试使用单声道运行时在 Windows 上运行 wpf 应用程序,无论该应用程序是否使用从 .NET 或 Mono 提供的托管库,我只关心是否单声道运行时(mono.dll ) 适用于 wpf 库;
  • @Thiado“我问的是是否有人尝试使用单声道运行时在 Windows 上运行 wpf 应用程序”该语句的问题是,WPF 无法使用单声道运行时运行,因为单声道运行时不支持它。这个问题相当于问“winforms 是否适用于单声道”。显然,mono 现在或将来不会也不会以任何形式支持 WPF。除了 Silverlight/Moonlight 以一种有限的方式,但我解决了那个途径。当我说“单声道”时,我指的是运行时和库。
  • Evan,Mono 运行时和 Mono BCL 之间存在差异。 Mono BCL 没有添加 WPF 库的计划,但是 Mono 运行时是 ECMA 公共语言基础设施的实现。 Mono 运行时和 .NET 运行时都是本机程序,主要目的是执行(JIT 编译)托管程序集(System.dll,PresentationFramework.dll)。这就是为什么 Mono 可以运行为 .NET 编写的程序,反之亦然。这就是我发布这个问题的原因。从理论上讲,Mono 运行时可以像 .NET 一样执行 WPF 库(只要由于 Directx 依赖关系而在 Windows 上)。
  • 自己看看:ecma-international.org/publications/standards/Standard.htm 没有任何地方说明 WPF/XAML 是 ECMA 标准。从理论上讲,单声道“可以”运行 WPF/XAML,但我回答中的第一个链接清楚地表明它不会,因为单声道开发团队不愿意支持它。在这种情况下,mono(组织)包含运行时和 BCL。
  • 他所说的是使用 Microsoft 的带有 mono 的 DLL,而不是 mono 自己的 WPF 实现。因此,如果我从 .NET 中获取 PresentationFramework.dll 并将其复制到 mono 的 gac,抛开法律问题,它会起作用吗?
【解决方案2】:

好吧,我确实尝试了一下,但收效甚微。如果需要的 dll 以混合模式(PresentationFramework、PresenationCore、WindowsBase、System.Xaml)实现,我首先检查了 corflags。它们都是纯 CIL 实现,因此应该可以正常使用单声道。接下来,我将提到的 DLL 安装到 mono 的 GAC 并尝试运行一个非常简单的 WPF 应用程序。这是我得到的:

  • 在 mini-codegen.c:1186 的断言,条件 `reginfo [sreg].born_in

    0' 未满足 此应用程序已请求运行时终止它 不寻常的方式。请联系应用程序的支持团队了解更多信息 信息。

因此,尽管理论上这应该都可以工作,但 WPF 在单声道上开箱即用可能会很复杂,如果有一个 WPF 的纯 CIL 实现,它与单声道和 .NET 框架兼容,那就太酷了.

【讨论】:

    【解决方案3】:

    据我所知,Mono does not support WPF

    此外,WPF 使用图形模块并直接与 GPU 交互。所以我看不出你如何在没有隐藏 pinvokes 的情况下使用 WPF。

    【讨论】:

    • 我认为这意味着 mono 基类库没有实现 WPF 库((presentationcore.dll,presentationframework.dll ...)。据我了解(en.wikipedia.org/wiki/Windows_Presentation_Foundation)WPF 进行非托管调用(使用 PInvoke?)到与 DirectX 通信的 milcore.dll。由于对 Directx 的依赖,WPF 库与 unix 系统不兼容,但是我认为它的库可以在 mono 运行时执行(可以运行 .net 3.5 托管库)如果运行时在 Windows 上加载。
    • 这可能是可能的,从来没有在unix环境之外尝试过mono。
    【解决方案4】:

    听起来您需要阅读 WPF 架构以更好地理解它。

    http://msdn.microsoft.com/en-us/library/ms750441.aspx

    Mono 中缺少许多部分,仅在 .NET 中可用。因此,您的“理论”不正确,您无法在 Mono 上运行 WPF 应用程序,即使在 Windows 上也是如此。

    【讨论】:

    • 您所说的“Mono 中缺少的部分且仅在 .NET 中可用”是什么意思? “PresentationCore.dll”和“PresentationFramework.dll”都是托管库,这使得它们与 Mono 的 JIT 兼容。 WPF 的唯一非托管部分是“milcore.dll”,(据我所知)可以通过 PInvoke 或内部 CLR 调用(均由 Mono 的 JIT 支持)从托管代码中调用。我已经阅读了您发布的链接,它没有说明仅适用于 .NET 的 CLR 的功能,也许您愿意解释一下?
    【解决方案5】:

    在 MIX 2010 上,Miguel de Icaza 在他的会议上说 Mono 不会支持 WPF。任何与类似 WPF 的支持相关的东西都只是为了提供 Moonlight 所需的内容。

    【讨论】:

      【解决方案6】:

      不完全,但是..

      您可以在桌面模式下使用 Moonlight 4 (silverlight 4):-

      https://github.com/inorton/MoonBase - MVVM 助手

      https://github.com/inorton/XamlPreviewer - XamlPad 克隆

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 2012-12-01
        • 2015-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多