System.TypeLoadException: не удалось разрешить тип с токеном 01000019

У меня есть решение Xamarin.Forms, которое содержит в каждом проекте (Android, iOS и Windows 8.1) lib под названием Plugin.SecureStorage отсюда: https://github.com/sameerkapps/SecureStorage Я установил его через NuGET в каждом проекте.

Все отлично работает в iOS и Windows 8.1, проблема в Android. Проект в Android строит правильно, однако при запуске я получаю следующее:

[...]
Loaded assembly: MonoDroidConstructors [External]
09-27 18:14:49.880 D/Mono    (30329): Assembly Ref addref AppConsume.Droid[0xb8cb0608] -> mscorlib[0xb8c64bc0]: 23
09-27 18:14:49.890 D/Mono    (30329): Assembly Ref addref Xamarin.Forms.Core[0xb8cbca58] -> System.Collections[0xb8cc5980]: 3
09-27 18:14:49.900 D/Mono    (30329): Assembly Ref addref Xamarin.Forms.Core[0xb8cbca58] -> System.Threading[0xb8cd4948]: 3
09-27 18:14:49.930 D/Mono    (30329): Assembly Ref addref AppConsume.Droid[0xb8cb0608] -> Plugin.SecureStorage[0xb8cb43f8]: 2
Unhandled Exception:

System.TypeLoadException: Could not resolve type with token 01000019

Что это значит? для меня немного загадочно. Как я могу решить эту проблему?

Конечно, в качестве требования я добавил эту строку...

SecureStorageImplementation.StoragePassword = "mypass";

в MainActivity.cs проекта Android...

using System;

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Plugin.SecureStorage;

namespace MyApp.Droid
{
    [Activity(Label = "MyApp", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SecureStorageImplementation.StoragePassword = "mypass";
            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
        }
    }
}

Я также обнаружил, что изменение позиции линии вызывает разные "типы токенов" в исключении.

UPDATE: Я только что нашел, что приложение успешно работает при компиляции в режиме выпуска. Однако, не работая в режиме отладки, проблема, которую я хотел бы исправить, я не думаю, что это выходит за рамки этого вопроса.

Ответ 1

Вот полное решение

  • Установить пакет nuget https://www.nuget.org/packages/sameerIOTApps.Plugin.SecureStorage/
  • Создайте SecureStorageLinkerOverride.cs в проекте Droid

    using System;
    using Plugin.SecureStorage;
    
    namespace MyApp.Droid
    {
        public static class LinkerPreserve
        {
            static LinkerPreserve()
            {
                throw new Exception(typeof(SecureStorageImplementation).FullName);
            }
        }
    
    
        public class PreserveAttribute : Attribute
       {
       }
    
    }
  • Щелкните правой кнопкой мыши на проекте Droid → Property → Android Option- > Linker → "Только сборки SDK"

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

Ответ 2

Такая же ошибка для меня.

Проблема:

В моем решении были разные версии пакета Xamarin.Froms.

Решение:

Измените в своем проекте Core, Droid и IOS версии Xamarin.Forms. Убедитесь, что все версии одинаковы.

Надеюсь, это сработает.

Ответ 3

В Visual Studio 2015 запуск проекта в режиме выпуска не имеет проблем (если вы не измените настройки по умолчанию)

В режиме отладки, выбрав ссылку: "Только сборки SDK" в свойствах проекта → Параметры Android → Linker, без проблем запускает проект.

Или просто оставьте эти настройки Debug и добавьте в проект Android файл SecureStorageLinkerOverride.cs:

using System;
using Plugin.SecureStorage;

namespace MyApp.Droid
{
    public static class LinkerPreserve
    {
        static LinkerPreserve()
        {
            throw new Exception(typeof(SecureStorageImplementation).FullName);
        }
    }

    public class PreserveAttribute : Attribute
    {
    }

}