【问题标题】:How to fix xamarin iOS linker from removing the code to prevent app crash?如何修复 xamarin iOS 链接器删除代码以防止应用程序崩溃?
【发布时间】:2017-02-22 05:38:34
【问题描述】:

我创建了一个 Xamarin.Forms PCL 项目。我已启用链接器以仅链接 sdk 程序集。加载速度更快,工作速度更快,尺寸更小,但在少数区域它会崩溃。我无法找出错误,因为当链接器被禁用时它工作正常。根据某人的建议,我在文件 LinkerPleaseInclude 中包含了几行。

var x = new System.ComponentModel.ReferenceConverter(typeof(void));

包含此行后,应用程序不会在少数区域崩溃,但数据不会像列表视图的动态数据模板那样显示。我是否需要在文件 LinkerPleaseInclude 中包含其他内容? 如何防止链接器在链接器启用时不删除代码?

【问题讨论】:

    标签: ios xamarin.ios linker xamarin.forms


    【解决方案1】:

    您可以提示链接器不要链接出由[Preserve] 属性修饰的类型。

    此属性未公开公开,但由于它是按名称(而不是按类型)自愿查找的,因此您可以定义自己的。

    namespace Your.Namespace.Here
    {
        [AttributeUsage(AttributeTargets.All)]
        public class PreserveAttribute : Attribute
        {
            public bool AllMembers;
            public bool Conditional;
    
            public PreserveAttribute(bool allMembers, bool conditional)
            {
                AllMembers = allMembers;
                Conditional = conditional;
            }
    
            public PreserveAttribute()
            {
            }
        }
    }
    

    然后,您可以使用 [Preserve] 属性装饰您的类型或方法,这些类型或方法未由代码显式引用,例如仅从 Xaml 或通过反射访问的类型。

    【讨论】:

    • 我需要将此添加到我的 iOS 项目中,并且我需要将 [Preserve] 属性添加到我的 PCL 项目中的任何位置?
    • 不,只有链接器会删除的类型,否则
    • 我已将 [Preserver] 属性添加到类中,但应用程序再次崩溃,就像崩溃一样。我试过 --linkskip=System.Runtime 但没有任何效果。我错过了什么吗?
    • 我也尝试过重新创建页面,以便我可以找到当时的错误,但它无法正常工作。当该特定点到来时,应用程序会立即崩溃
    • @StephaneDelcroix,我还可以创建一个 PreserveAttribute,它将 Type 作为构造函数参数吗?我需要在我的第三方库之一中保留 typeof(System.Linq.Queryable)。
    【解决方案2】:

    我已经解决了这个问题,我在我的列表视图中创建了 DynamicDataTemplate 来动态显示多种项目。我删除了它并创建了一个多模板选择器,现在它工作正常。 我不知道链接器将如何与 DynamicDataTemplate 一起使用,因为我尝试了 Preserve 属性,但它不起作用。但现在它工作正常。

    【讨论】:

      猜你喜欢
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      相关资源
      最近更新 更多