Xamarin.iOS链接器删除了反射所需的类中的成员

Phi*_*aré 7 c# linker xamarin.ios ios xamarin

在Xamarin项目中,我将链接器行为设置为"链接所有引用".这样做时,通过删除未使用的成员来优化程序集.一个问题,它实际上并不知道我们需要它们进行反思.我知道我们可以使用Preserve属性告诉链接器保留类中的所有符号,但是如果程序集是DLL或者不是iOS项目(不引用单触式程序集,并且不能).有没有办法可以将库中的所有类设置为"保留",忽略它,或者只设置某些要优化的类(反向PreserveAttribute)?

pou*_*pou 8

@SharpMobileCode提供了非常好的解释,但还有另外两种方法可以解决这个问题.

  1. 使用XML文件并--xml=your.file在项目的选项中使用Additional mtouch参数.当您不希望/需要使用工具生成要保留的成员列表时,无法更改程序集的源代码时,这可能很有用;

  2. 使用新的Preserve(Type)构造函数.这允许您在已经引用的不同程序集(例如主.exe)中添加保留指令Xamarin.iOS.dll(因此无需定义自己的类型).例如

[assembly: Preserve (typeof (MyType), AllMembers = true)]


Sha*_*ode 5

你可以做的是创建一个名为LinkerPleaseInclude.cs的文件.你可以实际命名它,但这个名字是有道理的.在那里,您可以为所需类型创建虚拟对象,尤其是反射.这样链接就会看到你"需要"它并且不会将其剥离.这是LinkerPleaseInclude.cs文件的示例.如果您需要的类是在第三方DLL中定义的,那么它很有用.

更新:

啊,我误读了你原来的帖子,以为你在谈论你无法控制的第三方DLL.因此,如果您有一个非xamarin.iOS库,您仍然可以使用Preserve属性.但是,您必须在库项目中定义它:

public sealed class PreserveAttribute : System.Attribute 
{
    public bool AllMembers;
    public bool Conditional;
}
Run Code Online (Sandbox Code Playgroud)

它没有定义Preserve类的命名空间,因为链接器只搜索Preserve名称.然后您可以像平常一样使用Preserve属性.因此,如果您想保留一个类和所有50个属性,那么您可以执行以下操作:

[Preserve(AllMembers=true)]
public MyClass
{
   //code here
}
Run Code Online (Sandbox Code Playgroud)