【问题标题】:How XAML compilation works at runtimeXAML 编译在运行时的工作原理
【发布时间】:2016-08-31 14:43:54
【问题描述】:

短版:

如果不使用 xamlc 来预编译 xaml,应用程序中捆绑了什么来在运行时编译 xaml?它是否依赖于 xamarin.forms nugets 之外的应用构建时的当前工具集?

长版:

我们有一个继承自列表视图的自定义元素。我们在 xaml 中使用这个元素,并在 xaml 中设置CachingStrategy,其中obviously is a problemdocumented properly。但在我们这样做的时候(大约 2015 年 12 月)并不为人所知。

使用当时可用的 xamarin 工具集构建应用程序(不确定版本,因为在该网站上我只能返回 2016 年 3 月以来的版本),应用程序可以正常工作而不会崩溃。

现在,构建相同的代码库(注意:xamarin 表单 nuget 版本等没有变化),应用程序崩溃。对问题启用 XAML 预编译阻塞,所以我们做对了,应用程序正常工作。

但是 - 这是否意味着构建工具链的某些部分已与应用程序合并?如果是这样,我们如何控制构建过程中的版本稳定性?

【问题讨论】:

  • 如果你有一些有效的 Xaml 只能在 XamlC 上工作,但没有它就会失败,这是一个错误,你应该报告它。

标签: xaml xamarin xamarin.forms


【解决方案1】:

XAMLC 生成在XamlCTask 构建步骤期间添加到程序集的 IL:

此工具包含在 Xamarin 安装程序中,它当然由版本化安装程序分发,因此如果您已经是 Toolchain Versioning,则无需执行任何其他操作...

恕我直言,工具链版本控制至少应包括所有已安装的 Xamarin 组件、Visual Studio 组件、MSBuild 工具、Xcode、Xcode 命令行工具、Android API SDK(工具、Build-工具、平台工具)等...

即如果您有新员工入职或开发人员硬盘崩溃或需要部署新的 CI 服务器,那么您今天如何重建该环境以使其与您环境的其余部分相匹配?如果您从头开始进行临时安装,每次都下载,那么您可能做错了;-)

作为一名 DevOps,我个人和我的客户都会对所有工具安装程序进行离线备份。这包括操作系统数据驱动器的快照,其中包括开发人员环境、CI 环境、密钥签名环境等...

与这些工具版本(操作系统、工具和 Nugets)相关的信息被放置在添加到解决方案 (.sln) 根目录的 PowerShell Desired State Configuration 文件中,并像任何其他源文件一样进行版本控制。

如果我每个人都需要重建开发/构建环境,运行 DSC 会将完整的环境恢复到物理机或虚拟机……对于 OS-X,通常我们创建并离线存储驱动器的 .IMG(我们还创建虚拟机以恢复)。

【讨论】:

  • 您知道禁用预编译时应用程序中包含哪些内容吗?因为该应用程序的旧版本没有预编译,并且可以正常工作。新的构建,同样没有预编译,崩溃了。
  • @SunnyMilenov 当禁用 XAML 编译时,XAML 以EmbeddedResource 的形式存储在程序集中,您可以参考XamlLoader 类中的ReadResourceAsXaml 方法并查看它从程序集中加载为一个资源并解析:github.com/xamarin/Xamarin.Forms/blob/…
【解决方案2】:

已构建工具链的任何部分都没有嵌入到应用程序中。

Xaml 文件作为EmbeddedResource 嵌入到程序集中,当您实例化视图时,默认构造函数会调用InitializeComponent(),然后它将找到正确的 Xaml,对其进行解析,并使用反射将其扩展为对象树.

这里根本没有魔法。

【讨论】:

  • 有道理,但这不是我们观察到的。过去我们没有启用 xamlc。和工作。升级 camarin,重建应用程序(没有代码更改,没有 xamlc),它失败了。正如我所说,它不是有效的 XAML,因为我们在继承列表中使用 CachingStrategy 时犯了错误,但它没有崩溃。
  • 我不知道你观察到了什么,但我想我知道我是如何实现它的......
猜你喜欢
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2020-12-07
  • 2012-02-14
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
相关资源
最近更新 更多