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
{
}
}