Xamarin / MonoTouch: no se puede compilar en el modo "Link SDK only" debido a la falta de símbolos
Estoy tratando de compilar mi aplicación iOS usando MonoTouch en modo solo SDK Link. Se compila completamente bien si apago los enlaces por completo, pero también produce un binario colosal que no es adecuado para el modo de lanzamiento.
Desafortunadamente, una de las bibliotecas que necesito de alguna manera invoca Expression.Visit y no puedo encontrar la manera de instruir al enlazador para que no lo elimine. Esto da como resultado este error de compilación:
Error MT2002: Error al resolver "System.Linq.Expressions.Expr, ession System.Linq.Expressions.ExpressionVisitor :: Visita (System.Linq.Expressions.Expression)" referencia de "System.Core, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e "(MT2002) (MyApp)
Segúnla documentación sobre enlaces personalizados, He configurado un archivo de enlace para intentar evitar que esto suceda:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="System.Linq.Expressions.Expression Visit(System.Linq.Expressions.Expression)" />
</type>
</assembly>
</linker>
Desafortunadamente, eso no tiene ningún efecto: el error simplemente ocurre como antes.
La documentación menciona unpreserve="fields"
parámetro que puedo suministrar a<type>
Así que intenté eso:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
</assembly>
</linker>
Eso tampoco funcionó.
Luego introduje un error de sintaxis XML en el archivo y la compilación falló diciendo que no podía analizar el archivo enlazador, así que al menos sé que el archivo se está leyendo.
Pero luego intenté introducir errores en el nombre del ensamblado:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="NonexistentAssembly">
</assembly>
</linker>
Eso causó un error, quejándose de que el ensamblaje no se pudo resolver.
Luego intenté destrozar el nombre del tipo:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="NonExistentType" preserve="methods" />
</assembly>
</linker>
Ahora, eso acaba de comenzar a mostrar el mismo error "no se puede resolver expressionvisitor :: visit" que estaba viendo antes. Parece que los nombres de tipo no están marcados.
Además, tampoco lo son los nombres de firma, ya que esto también presentó el mismo error de compilación.
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="jg98j23890rj2390erk90fk3ew!]['##'#'[" />
</type>
</assembly>
</linker>
Por lo tanto, parece que siempre que especifique el nombre del ensamblado y tenga una estructura XML válida, el archivo enlazador no genera ninguna excepción. Sin embargo, la documentación para el archivo de enlace no es especialmente detallada para un tema tan complejo e incluye numerosos errores de sintaxis, es decir:
<type fullname="Foo" preserve="fields" />
<method name=".ctor" />
</type>
Además, no proporciona una descripción técnica del formato de archivo del vinculador, por lo que es muy posible que mi definición sea totalmente incorrecta.
También he intentado simplemente omitir la vinculación de System.Core por completo con--linkskip=System.Core
Pero esto no tiene ningún efecto. He probado esta bandera con y sin--xml
.
En el proyecto MvvmCross, intenté especificar una nueva clase para llamar al método Visit en el mismo estilo que el archivo LinkerPleaseInclude.cs que el paquete MvvmCross NuGet agrega a cada proyecto iOS:
[Preserve]
public class PleaseIncludeVisitor : ExpressionVisitor
{
public PleaseIncludeVisitor()
{
this.Visit(null);
}
}
Desafortunadamente, esto tampoco tuvo efecto.
Actualmente estoy usando Mono 3.2.6 ((no / 9b58377) y Xamarin.iOS v7.0.7.2.