Xamarin / MonoTouch: Não foi possível compilar no modo "Link SDK only" devido à falta de símbolos
Estou tentando compilar meu aplicativo iOS usando o MonoTouch no modo Link SDK only. Compila completamente bem se eu desativar o link completamente, mas também produz um binário colossal que não é adequado para o modo de liberação.
Infelizmente, uma das bibliotecas de que preciso, de alguma forma, chama Expression.Visit e não consigo descobrir como instruir o vinculador para não removê-lo. Isso resulta neste erro de compilação:
Erro MT2002: falha ao resolver a referência "System.Linq.Expressions.Expr, ession System.Linq.Expressions.ExpressionVisitor :: Visit (System.Linq.Expressions.Expression)" da referência "System.Core, Versão = 2.0.5.0, Cultura = neutro, PublicKeyToken = 7cec85d7bea7798e "(MT2002) (MyApp)
Conformea documentação sobre vinculação personalizada, Configurei um arquivo vinculador para tentar impedir que isso aconteça:
<?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>
Infelizmente, isso não tem nenhum efeito - o erro acontece como antes.
A documentação menciona umpreserve="fields"
parâmetro que eu posso fornecer para<type>
, então eu tentei isso:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
</assembly>
</linker>
Isso também não funcionou.
Em seguida, introduzi um erro de sintaxe XML no arquivo e a compilação falhou, dizendo que não era possível analisar o arquivo vinculador, pelo menos sei que o arquivo está sendo lido.
Mas tentei introduzir erros no nome do assembly:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="NonexistentAssembly">
</assembly>
</linker>
Isso causou um erro, reclamando que a montagem não pôde ser resolvida.
Tentei então alterar o nome do tipo:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="NonExistentType" preserve="methods" />
</assembly>
</linker>
Agora, isso começou a mostrar o mesmo erro "incapaz de resolver o expressionvisitor :: visit" que eu estava vendo antes. Parece que os nomes dos tipos não estão marcados.
Além disso, nenhum dos nomes de assinatura é apresentado, pois também apresentou o mesmo erro de compilação.
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="jg98j23890rj2390erk90fk3ew!]['##'#'[" />
</type>
</assembly>
</linker>
Portanto, parece que, desde que você especifique o nome do assembly e tenha uma estrutura XML válida, o arquivo vinculador não causa exceções. A documentação para o arquivo vinculador, porém, não é especialmente detalhada para um tópico tão complexo e inclui vários erros de sintaxe, ou seja:
<type fullname="Foo" preserve="fields" />
<method name=".ctor" />
</type>
Além disso, ele não fornece uma descrição técnica do formato do arquivo vinculador, portanto, é perfeitamente possível que minha definição esteja totalmente errada.
Eu também tentei apenas pular a ligação do System.Core inteiramente com--linkskip=System.Core
mas isso não tem efeito. Eu tentei essa bandeira com e sem--xml
.
No projeto MvvmCross, tentei especificar uma nova classe para chamar o método Visit no mesmo estilo que o arquivo LinkerPleaseInclude.cs que é adicionado a cada projeto iOS pelo pacote MvvmCross NuGet:
[Preserve]
public class PleaseIncludeVisitor : ExpressionVisitor
{
public PleaseIncludeVisitor()
{
this.Visit(null);
}
}
Infelizmente, isso também não teve efeito.
Atualmente, estou usando o Mono 3.2.6 ((no / 9b58377) e o Xamarin.iOS v7.0.7.2.