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.

Ответы на вопрос(1)

Ваш ответ на вопрос