Xamarin / MonoTouch: Kompilieren im Modus "Nur SDK verknüpfen" aufgrund fehlender Symbole nicht möglich
Ich versuche, meine iOS-Anwendung mit MonoTouch nur im Link SDK-Modus zu kompilieren. Die Kompilierung funktioniert einwandfrei, wenn ich die Verknüpfung vollständig deaktiviere, es wird jedoch auch eine kolossale Binärdatei erstellt, die nicht für den Release-Modus geeignet ist.
Leider ruft eine der Bibliotheken, die ich benötige, Expression.Visit auf und ich kann nicht herausfinden, wie ich den Linker anweisen kann, sie nicht zu entfernen. Dies führt zu folgendem Kompilierungsfehler:
Fehler MT2002: Fehler beim Auflösen der Referenz "System.Linq.Expressions.Expr, ession System.Linq.Expressions.ExpressionVisitor :: Visit (System.Linq.Expressions.Expression)" aus "System.Core, Version = 2.0.5.0, Culture = neutral, PublicKeyToken = 7cec85d7bea7798e "(MT2002) (MyApp)
Wie prodie Dokumentation zur benutzerdefinierten VerknüpfungIch habe eine Link-Datei eingerichtet, um dies zu verhindern:
<?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>
Das hat leider keine Auswirkung - der Fehler tritt wie bisher auf.
Die Dokumentation erwähnt apreserve="fields"
Parameter, den ich liefern kann<type>
Also habe ich das versucht:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
</assembly>
</linker>
Das hat auch nicht funktioniert.
Ich habe dann einen XML-Syntaxfehler in die Datei eingefügt und der Build schlug fehl und sagte, er könne die Linkerdatei nicht analysieren, sodass ich zumindest weiß, dass die Datei gelesen wird.
Aber dann habe ich versucht, Fehler in den Assemblynamen einzufügen:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="NonexistentAssembly">
</assembly>
</linker>
Dies verursachte einen Fehler und beschwerte sich, dass die Baugruppe nicht gelöst werden konnte.
Ich habe dann versucht, den Typnamen zu entstellen:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="NonExistentType" preserve="methods" />
</assembly>
</linker>
Nun, das hat gerade angefangen, den gleichen Fehler "expressionvisitor :: visit kann nicht aufgelöst werden" anzuzeigen, den ich zuvor gesehen habe. Es scheint, dass Typnamen nicht überprüft werden.
Auch Signaturnamen weisen nicht den gleichen Kompilierungsfehler auf.
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="jg98j23890rj2390erk90fk3ew!]['##'#'[" />
</type>
</assembly>
</linker>
Solange Sie also den Assemblynamen angeben und eine gültige XML-Struktur haben, werden durch die Linkerdatei keine Ausnahmen ausgelöst. Die Dokumentation für die Linker-Datei ist jedoch für ein so komplexes Thema nicht besonders ausführlich und enthält zahlreiche Syntaxfehler, d. H .:
<type fullname="Foo" preserve="fields" />
<method name=".ctor" />
</type>
Außerdem gibt es keine technische Beschreibung des Linker-Dateiformats, sodass es durchaus möglich ist, dass meine Definition völlig falsch ist.
Ich habe auch versucht, einfach die Verlinkung von System.Core ganz mit zu überspringen--linkskip=System.Core
Dies hat jedoch keine Auswirkung. Ich habe diese Flagge sowohl mit als auch ohne ausprobiert--xml
.
Im MvvmCross-Projekt habe ich versucht, eine neue Klasse anzugeben, um die Visit-Methode im selben Stil wie die LinkerPleaseInclude.cs-Datei aufzurufen, die vom MvvmCross NuGet-Paket zu jedem iOS-Projekt hinzugefügt wird:
[Preserve]
public class PleaseIncludeVisitor : ExpressionVisitor
{
public PleaseIncludeVisitor()
{
this.Visit(null);
}
}
Dies hatte leider auch keine Auswirkung.
Ich verwende derzeit Mono 3.2.6 ((no / 9b58377) und Xamarin.iOS v7.0.7.2.