Предполагается, что в вашей конфигурации выпуска для Linker установлено что-то другое , чем None
?
Классы, конструкторы и / или методы, на которые ссылаются только посредством отражающих вызовов для активации и которые используются через интерфейсы (типичные для DI), не могут быть видны при статическом анализе, который выполняет Mono Linker, и, таким образом, удаляются из сборки (й). ), чтобы получить окончательный размер пакета приложения до «приемлемого» размера.
Примечание. Этот процесс сравним с инструментом Proguard, и его замена R8
используется для удаления неиспользуемого кода Java и имеет некоторые «ограничения», и большинство моих Xamarin.Android
проектов заканчиваются пользовательским Mono linker и файл конфигурации Proguard / R8.
Если вы не «владеете» кодом, который удаляется, вы можете вручную ссылаться на класс / метод, чтобы компоновщик не удалял его:
[Preserve]
public static class LinkerPreserve
{
static LinkerPreserve()
{
throw new Exception(typeof(My.Library.SomeManager).FullName);
}
}
Если вы владеете кодом, вы можете применить PreserveAttribute
к классу.
[Preserve]
public class SomeManager
{
~~~~
}
Вы также можете применить --linkskip=ASSEMBLY
в опциях сборки ...
Подробнее см. В документах:
Он принимает полный контроль над процессом связывания Mono, вы можете создать собственный файл конфигурации связывания: