Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XAML编译在运行时的工作原理_Xaml_Xamarin_Xamarin.forms - Fatal编程技术网

XAML编译在运行时的工作原理

XAML编译在运行时的工作原理,xaml,xamarin,xamarin.forms,Xaml,Xamarin,Xamarin.forms,简短版本: 如果不使用xamlc预编译xaml,那么应用程序中捆绑了什么来在运行时编译xaml?它是否依赖于xamarin.forms nugets之外的应用程序构建时的当前工具集 长版本: 我们有一个从列表视图继承的自定义元素。我们在xaml中使用这个元素,并在xaml中设置CachingStrategy,其中,和。但在我们这么做的时候(大约2015年12月),我们还不知道这一点 使用当时可用的xamarin工具集构建应用程序(不确定版本,因为在网站上我只能返回到2016年3月的版本),该应用

简短版本:

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

长版本:

我们有一个从列表视图继承的自定义元素。我们在xaml中使用这个元素,并在xaml中设置
CachingStrategy
,其中,和。但在我们这么做的时候(大约2015年12月),我们还不知道这一点

使用当时可用的xamarin工具集构建应用程序(不确定版本,因为在网站上我只能返回到2016年3月的版本),该应用程序在没有崩溃的情况下工作

现在,构建相同的代码库(注意:xamarin表单nuget版本等没有更改),应用程序崩溃。在这个问题上启用XAML预编译,所以我们做得很好,应用程序可以正常工作


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

XAMLC
生成IL,该IL在
XamlCTask
构建步骤中添加到程序集:

这个工具包含在Xamarin安装程序中,当然是由版本化的安装程序分发的,所以如果您已经在进行工具链版本化,那么您不需要做任何其他事情

首先,工具链版本控制至少应包括所有已安装的Xamarin组件、Visual Studio组件、MSBuild工具、Xcode、Xcode cmd行工具、Android API SDK(工具、构建工具、平台工具)等

也就是说,如果您有一个新员工开始工作,或者开发人员硬盘驱动器崩溃,或者需要部署一个新的CI服务器,您现在如何重建该环境,使其与环境的其余部分相匹配?如果您是从头开始执行每次下载的临时安装,则可能是错误的;-)

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

与这些工具版本(操作系统、工具和NUGET)相关的信息放置在PowerShell
所需状态配置
文件中,该文件添加到解决方案(.sln)根目录,并与任何其他源文件一样进行版本控制


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

应用程序中未嵌入任何构建的工具链

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


这里一点魔力都没有。

你知道当预编译被禁用时,应用程序中包含了什么吗?因为应用程序的旧版本没有预编译,并且它正在工作。而新的构建(同样没有预编译)会崩溃。@SunnyMilenov当XAML编译被禁用时,XAML将作为
嵌入资源存储在程序集中,您可以参考
XamlLoader
类中的
ReadResourceAsXaml
方法,并将其作为资源从程序集中加载并解析:如果您有一些有效的Xaml只在XamlC打开时工作,但在没有它的情况下失败,则这是一个错误,您应该报告它。这是有意义的,但这不是我们观察到的。我们在过去没有启用xamlc。而这一切都起了作用。升级camarin,重新构建应用程序(无代码更改,无xamlc),然后失败。正如我所说,它不是有效的XAML,因为我们在继承列表中使用CachingStrategy时犯了错误,但它并没有崩溃。我不知道你们观察到了什么,但我想我知道我是如何实现它的。。。