Created
April 20, 2017 11:26
-
-
Save cryophobia/ace5ae71a5948594f6d7901525a67c14 to your computer and use it in GitHub Desktop.
object_setClass - Type ObjCRuntime.Class which is passed to unmanaged code must have a StructLayout attribute.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Runtime.InteropServices; | |
using AVKit; | |
using Foundation; | |
using ObjCRuntime; | |
namespace Xamarin_ios_language_manager | |
{ | |
public class ExtendedBundle : NSBundle | |
{ | |
static NSString bundleKey = new NSString("0"); | |
public override string LocalizedString(string key, string value, string table) | |
{ | |
NSBundle bundle = this.GetProperty<ExtendedBundle>(bundleKey); | |
if (bundle != null) | |
{ | |
return bundle.LocalizedString(key, value, table); | |
} | |
else | |
{ | |
return base.LocalizedString(key, value, table); | |
} | |
} | |
public static void SetLanguage(string currentLanguage) | |
{ | |
try | |
{ | |
//static dispatch_once_t onceToken; | |
//dispatch_once(&onceToken, ^{ | |
NSBundleAssociatedObjectExtension.object_setClass(MainBundle.Handle, new Class (typeof(ExtendedBundle)).Handle); | |
//}); | |
var bundle = FromPath(MainBundle.PathForResource("de", "lproj")); | |
MainBundle.SetProperty(bundleKey, bundle, NSBundleAssociatedObjectExtension.AssociationPolicy.RetainNonAtomic); | |
} | |
catch (Exception ex) | |
{ | |
throw (new Exception(ex.Message)); | |
} | |
} | |
} | |
public static class NSBundleAssociatedObjectExtension | |
{ | |
public enum AssociationPolicy | |
{ | |
Assign = 0, | |
RetainNonAtomic = 1, | |
CopyNonAtomic = 3, | |
Retain = 01401, | |
Copy = 01403, | |
} | |
[DllImport("/usr/lib/libobjc.dylib")] | |
public static extern Class object_getClass(IntPtr obj); | |
[DllImport("/usr/lib/libobjc.dylib")] | |
public static extern Class object_setClass(IntPtr obj, IntPtr cls); | |
[DllImport("/usr/lib/libobjc.dylib")] | |
static extern void objc_setAssociatedObject(IntPtr pointer, IntPtr key, IntPtr value, AssociationPolicy policy); | |
[DllImport("/usr/lib/libobjc.dylib")] | |
static extern IntPtr objc_getAssociatedObject(IntPtr pointer, IntPtr key); | |
public static T GetProperty<T>(this NSBundle bundle, NSString propertyKey) where T : NSObject | |
{ | |
var pointer = objc_getAssociatedObject(bundle.Handle, propertyKey.Handle); | |
return Runtime.GetNSObject<T>(pointer); | |
} | |
public static void SetProperty<T>(this NSBundle bundle, NSString propertyKey, T value, AssociationPolicy policy) where T : NSObject | |
{ | |
objc_setAssociatedObject(bundle.Handle, propertyKey.Handle, value.Handle, policy); | |
} | |
} | |
} |
I am too getting this problem: Type ObjCRuntime.Class which is passed to unmanaged code must have a StructLayout attribute
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How did you fix this error?