当我像这样在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编译优化了这些方法,因为它们没有被调用。我不知道它增加了哪些方法,所以我希望编译器,在我的实验中,不要优化任何东西。怎么才能做到呢?或者是否存在其他防止自动删除方法的技巧?
编辑:完整的代码,如果这还不够清楚;
- 结果输出将不包含'Add'和'set_View';
public class TestController : UIViewController { public override void ViewDidLoad () { base.ViewDidLoad (); foreach (var m in this.GetType().GetMethods()) { Console.WriteLine (m.Name); } } }
- Output包含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); } } }
您可以将链接器选项设置为"仅链接SDK程序集",或者在类上使用PreserveAttribute。
详情见Xamarin网站:http://developer.xamarin.com/Guides/ios/Advanced_Topics/Linker/
<链接行为/strong>
链接过程可以通过不同的方式定制。主Xamarin Studio中控制链接器的机制是链接器在iOS Build Xamarin Studio的Project Options中的Behavior下拉菜单对话框。在Visual Studio中,它位于项目属性中,
保码
当你使用链接器时,它有时会删除代码您可能已经使用System.Reflection.MemberInfo。调用,或通过将方法导出到Objective-C使用[Export]属性,然后调用手动选择器。
在这些情况下,您可以指示链接器考虑整个要使用的类或通过应用程序保存的单个成员(Xamarin.iOS.Foundation。保存]属性类级别或成员级别。非静态的所有成员所链接的应用程序将被删除。这个属性是因此,用于标记不是静态引用的成员,而是
例如,如果您动态实例化类型,您可能希望保留类型的默认构造函数。如果你使用XML序列化时,您可能希望保留类型的属性。
可以将此属性应用于类型的每个成员或类型本身。如果希望保留整个类型,可以使用该语法[Preserve (AllMembers = true)] on type.
有时你想保留某些成员,但只有当保留了包含类型。在这些情况下,使用[保存](条件= true)]