我有一个Xamarin.Forms解决方案,它在每个项目(Android,iOS和Windows 8.1)中包含一个名为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";
在Android项目的MainActivity.cs中......
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());
}
}
}
我还发现更改行位置会在异常中抛出不同的“令牌类型”。
更新:我发现在发布模式中进行编译时,应用程序运行成功。但是,不能在调试模式下工作是一个我想修复的问题我不认为这超出了这个问题的范围。
答案 0 :(得分:33)
对我来说同样的错误。
问题:
我的解决方案中有Xamarin.Forms
包的不同版本。
解决方案:
您的Core,Droid和IOS项目的变更为Xamarin.Forms
版本。确保所有版本都相同。
我希望这有效。
答案 1 :(得分:3)
在Visual Studio 2015中,以发布模式运行项目没有问题(如果您不更改默认设置)
在调试模式中选择链接:项目属性中的“仅限SDK程序集” - > Android选项 - > Linker将毫无问题地运行项目。
或者只是简单地将这些调试设置和在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
{
}
}
答案 2 :(得分:0)
这是完整的解决方案
在 Droid 项目中创建 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 { }
右键单击Droid Project - >财产 - > Android选项 - >链接器 - > “仅限SDK程序集”
现在运行你的项目。对于标记为答案的任何其他问题的评论如下。
答案 3 :(得分:0)
确保Xamarin.Forms在Xamarin.Android,Xamarin.iOS ...项目中是最新的