【问题标题】:Preventing Xamarin(/Mono?) from optimizing on iOS防止 Xamarin(/Mono?) 在 iOS 上进行优化
【发布时间】:2014-07-17 09:09:28
【问题描述】:

当我像这样在 ViewDidLoad 中使用反射时:

foreach (var m in this.GetType().GetMethods()) {
            Console.WriteLine (m.Name); 
}

无需任何其他代码,方法如

Add
set_View

不在那里;当我添加时;

public void PreventOptimizing() {
    var x = this.View; 
    this.View = x; 
    this.Add (null); 
}

到类并且不调用该方法,它们就在那里。所以我假设 AOT 编译优化了这些方法,因为它们没有被调用。我不知道它添加了哪些方法,所以我希望编译器在我的实验中不要优化任何东西。怎么可能呢?还是有其他技巧可以防止自动删除方法?

编辑:完整的代码,如果这还不够清楚的话;

  1. 结果输出将不包含“Add”和“set_View”;
public class TestController : UIViewController
{

    public override void ViewDidLoad ()
  {
         base.ViewDidLoad ();

      foreach (var m in this.GetType().GetMethods()) {
          Console.WriteLine (m.Name); 
      }
    }
}
  1. 输出确实包含 Add 和 set_View;
public class TestController : UIViewController
{
  public void PreventOptimizing() {
      var x = this.View; 
      this.View = x; 
      this.Add (null); 
  }
  public override void ViewDidLoad ()
  {
         base.ViewDidLoad ();

      foreach (var m in this.GetType().GetMethods()) {
          Console.WriteLine (m.Name); 
      }
    }
}

【问题讨论】:

    标签: ios mono xamarin


    【解决方案1】:

    您要么将链接器选项设置为“仅链接 SDK 程序集”,要么在类上使用 PreserveAttribute

    详细信息在 Xamarin 网站上: http://developer.xamarin.com/Guides/ios/Advanced_Topics/Linker/

    链接器行为

    可以通过不同的方式自定义链接过程。首要的 Xamarin Studio 中控制链接器的机制是链接器 iOS Build Xamarin Studio 的项目选项中的行为下拉菜单 对话框。在 Visual Studio 中,它位于项目属性中, 在 iOS 构建下。

    保留代码

    当您使用链接器时,它有时会删除代码 您可能使用动态调用 System.Reflection.MemberInfo.Invoke,或将您的方法导出到 Objective-C 使用 [Export] 属性,然后调用 手动选择器。

    在这些情况下,您可以指示链接器考虑整个 要使用的类或要通过应用保存的单个成员 [Xamarin.iOS.Foundation.Preserve] 属性要么在 类级别或成员级别。 不是静态的每个成员 由应用程序链接的内容可能会被删除。这个属性是 因此用于标记非静态引用的成员,但 您的应用程序仍然需要它们。

    例如,如果您动态实例化类型,您可能希望 保留类型的默认构造函数。如果您使用 XML 序列化,您可能希望保留类型的属性。

    您可以将此属性应用于类型的每个成员,或应用于该类型 本身。如果要保留整个类型,可以使用语法 [Preserve (AllMembers = true)] 类型。

    有时您想保留某些成员,但前提是 包含类型被保留。在这些情况下,使用 [Preserve (条件=真)]

    【讨论】:

    • 谢谢。但顺便说一句,我总是设置“仅链接 SDK 程序集”,因为 Xamarin Studio 中有一个(昨天的新更新)错误,这没有什么区别;它仍然删除代码。而且我不能把 Preserve 放在任何地方,因为我不确定会使用什么......
    • 好的,所以 Xamarin 说实际上不要链接以保留所有内容。所以这种行为实际上是那个错误的一个很好的巧合,我在绕过它之后尝试了这个反射......(更新是从 7 月 3 日开始的,但我昨天才更新并且有这个新错误)
    猜你喜欢
    • 2013-08-22
    • 2017-02-28
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    相关资源
    最近更新 更多