Xamarin / MonoTouch: невозможно компилировать в режиме «Link SDK only» из-за пропущенных символов
Я пытаюсь скомпилировать приложение для iOS, используя MonoTouch в режиме Link SDK only. Он полностью компилируется, если я полностью отключаю линковку, но также создает колоссальный бинарный файл, который не подходит для режима релиза.
К сожалению, одна из библиотек, которая мне нужна, каким-то образом вызывает Expression.Visit, и я не могу понять, как дать указание компоновщику не удалять его. Это приводит к этой ошибке компиляции:
Ошибка MT2002: не удалось разрешить ссылку "System.Linq.Expressions.Expression System.Linq.Expressions.ExpressionVisitor :: Visit (System.Linq.Expressions.Expression)" из System.Core, версия = 2.0.5.0, культура = нейтральная , PublicKeyToken = 7cec85d7bea7798e "(MT2002) (MyApp)
Согласнодокументация по пользовательским ссылкамЯ установил файл компоновщика, чтобы попытаться остановить это:
<?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>
К сожалению, это не имеет никакого эффекта - ошибка происходит, как и раньше.
В документации упоминаетсяpreserve="fields"
параметр, который я могу поставить<type>
так что я попробовал это:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor" preserve="methods" />
</assembly>
</linker>
Это тоже не сработало.
Затем я ввел в файл синтаксическую ошибку XML, и сборка не удалась, сказав, что он не может проанализировать файл компоновщика, поэтому я по крайней мере знаю, что файл читается.
Но затем я попытался ввести ошибки в название сборки:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="NonexistentAssembly">
</assembly>
</linker>
Это вызвало ошибку, жалуясь, что сборка не может быть решена.
Затем я попытался исказить имя типа:
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="NonExistentType" preserve="methods" />
</assembly>
</linker>
Теперь, это только начало показывать ту же самую ошибку «невозможно решить expressionvisitor :: visit», которую я видел прежде. Кажется, что имена типов не проверяются.
Кроме того, имена подписей также не являются, поскольку это также представляет ту же ошибку компиляции.
<?xml version="1.0" encoding="UTF-8" ?>
<linker>
<assembly fullname="System.Core">
<type fullname="System.Linq.Expressions.ExpressionVisitor">
<method signature="jg98j23890rj2390erk90fk3ew!]['##'#'[" />
</type>
</assembly>
</linker>
Таким образом, кажется, что пока вы указываете имя сборки и имеете правильную структуру XML, файл компоновщика не вызывает каких-либо исключений. Документация для файла компоновщика, хотя и не особенно многословна для такой сложной темы и включает в себя многочисленные синтаксические ошибки, т.е.
<type fullname="Foo" preserve="fields" />
<method name=".ctor" />
</type>
Кроме того, он не дает технического описания формата файла компоновщика, поэтому вполне возможно, что мое определение совершенно неверно.
Я также попытался просто пропустить связывание System.Core полностью с--linkskip=System.Core
но это не имеет никакого эффекта. Я пробовал этот флаг как с, так и без--xml
.
В проекте MvvmCross я попытался указать новый класс для вызова метода Visit в том же стиле, что и файл LinkerPleaseInclude.cs, который добавляется в каждый проект iOS с помощью пакета MvvmCross NuGet:
[Preserve]
public class PleaseIncludeVisitor : ExpressionVisitor
{
public PleaseIncludeVisitor()
{
this.Visit(null);
}
}
К сожалению, это также не имело никакого эффекта.
В настоящее время я использую Mono 3.2.6 ((нет / 9b58377) и Xamarin.iOS v7.0.7.2.