Хобрук: Ваш путь к мастерству в программировании

Как заставить класс не удаляться при линковке?

Как заставить класс не удаляться при линковке? Пишу для Android приложение в Visual Studio 2015 на фреймворке Xamarin. Столкнулся с такой проблемой: Приложение работает нормально в режиме Debug, но при переводе в режим Release функционал приложения теряется, т.е. несколько классов удаляются при линковке а когда звонят, приложение давится. Пробовал обе написанные документации Xamarin поставил перед классом один из атрибутов:

[Android.Runtime.Preserve]
[Android.Runtime.Preserve (AllMembers = true)]
[Android.Runtime.Preserve (Conditional = true)]

не помогло. Я также пробовал:

#pragma warning disable 0219, 0649

Это не помогло. Я пытался использовать linkskip, но это не помогло.

Единственное решение найдено, это в свойствах компоновщика указать Linker Behavior = Do Not Link (None в Visual Studio) (в режиме Debug). Но это плохое решение, т.к. подходит для отладки, но не для релиза. А размер приложения увеличился более чем в 2,5 раза!


Ответы:


1

У меня была та же проблема, и для меня было решено изменить поведение компоновщика на только сборки Link SDK, а также изменить канал студии Xamarin на Alpha.

22.08.2016
  • спасибо за ответ, но переключаться на альфа-канал не хочет. Буду ждать стабильной версии, возможно этот баг исправят 22.08.2016

  • 2

    Один из вариантов — создать файл linker.xml в корне проекта, как описано здесь . Файл должен содержать все типы, которые вы хотите гарантировать, что они не будут удалены во время связывания. Что-то типа:

    <?xml version="1.0" encoding="UTF-8"?>
    <linker>
        <assembly fullname="Your.Assembly.Name">
            <type fullname="Fully.Qualified.Type.Name" />
        </assembly>
    </linker>
    

    Обязательно задайте для действия сборки файла значение LinkDescription.

    Кроме того, у меня была проблема, когда я включал один тип, но его базовый класс удалялся во время связывания. Не забудьте включить всех предков типа.

    Надеюсь, это поможет,

    Павел

    02.03.2017
    Новые материалы

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..

    Настольный ПК как «одно кольцо, чтобы править всеми» домашних компьютеров
    Вид после 9 месяцев использования С настольных компьютеров все началось, но в какой-то момент они стали «серверами», и мы все перешли на ноутбуки. В прошлом году я столкнулся с идеей настольных..

    Расширенные методы безопасности для VueJS: реализация аутентификации без пароля
    Руководство, которое поможет вам создавать безопасные приложения в долгосрочной перспективе Безопасность приложений часто упускается из виду в процессе разработки, потому что основная..

    стройный-i18следующий
    Представляем стройную оболочку для i18next. Эта библиотека, основанная на i18next, заключает экземпляр i18next в хранилище svelte и отслеживает события i18next, такие как languageChanged,..