使用Sdk和UserAssemblies链接时,在运行时找不到Clickevent(链接所有程序集)

时间:2016-05-27 06:20:11

标签: c# xamarin linker xamarin.forms

我在Xaml中有按钮,我已经提到了在click事件中调用的方法,如下所示。

<Button BorderRadius="1" BackgroundColor="#FFCA00" Text="Sign In" TextColor="Black" Clicked="login_clicked" HorizontalOptions="FillAndExpand" HeightRequest="44" WidthRequest="220" FontSize="19">

后端C#中的方法为

public void login_clicked(object sender, EventArgs e)
{
     try
     {
          ValidateUser();
     }
     catch (Exception ex){}
}

问题是当我在链接选项中使用Sdk Assemblies时这很有效,但是当我使用Sdk and User Assemblies时,这个方法会被剥离,我在运行时遇到一个异常,说没有事件login_clicked找到。

我知道这是因为链接器,但我不知道背后的原因。链接器是否解析Xaml以检查是否使用了此方法(我的意思是说这是方法是否必要且不应该被删除)。

当我从C#注册事件时,链接器不会删除login_clicked方法。

btnLogin.Clicked += login_clicked;

1 个答案:

答案 0 :(得分:1)

XAML未被解析为编译时,它基本上是一个资源字符串。

两个选项:

1)使用[Preserve]属性标记方法,以便链接器不会将其删除。

[Preserve]

参考:Cross platform Linking 参考:iOS Linker 参考:Android Linker

2)将XAML预编译到IL中,以便链接器知道正在使用该事件。

[assembly: XamlCompilation (XamlCompilationOptions.Compile)]

这有一个额外的好处,就是编译时检查你的XAML,一些XAML加载和实例化时间的减少,以及轻微的内存减少。

参考:Using the XAML compiler to increase the performance of a Xamarin.Forms app