こんにちは私はグーグルアドボードをV6に更新しようとしていますが、以下をバインドして管理された世界に公開するのに問題があります
私は次の構造体を持っています
typedef struct GADAdSize {
CGSize size;
NSUInteger flags;
} GADAdSize;
モノタッチ側でやった
[StructLayout(LayoutKind.Sequential)]
public struct GADAdSize
{
public SizeF size;
public uint flags;
}
私は次のコードを持っています
extern GADAdSize const kGADAdSizeBanner;
extern GADAdSize const kGADAdSizeMediumRectangle;
[フィールド]属性を使用してバインドすることはできません。ドキュメントでは、フィールド属性は次の目的でのみ使用できると指定されているためです。
- NSString参照
- NSArrayリファレンス
- 32ビットint(System.Int32)
- 32ビットフロート(System.Single)
- 64ビットフロート(System.Double)
だから私は私が考えることができる次の2つの方法を試しました
[DllImport ("__Internal")]
extern static IntPtr kGADAdSizeMediumRectangle ();
public static GADAdSize MediumRectangle
{
get
{
object obj = Marshal.PtrToStructure(kGADAdSizeMediumRectangle(), typeof(GADAdSize));
return (GADAdSize) obj;
}
}
と
public static GADAdSize Banner
{
get
{
var handle = Dlfcn.dlopen ("libGoogleAdMobAds", 0);
IntPtr ptr = Dlfcn.GetIntPtr(handle, "kGADAdSizeBanner");
Dlfcn.dlclose (handle);
object obj = Marshal.PtrToStructure(ptr, typeof(GADAdSize));
return (GADAdSize) obj;
}
}
そして両方の方法でそれはクラッシュします
DLLImportを使用すると、Marshal.PtrToStructure()を呼び出すときにnull引数の例外が発生し、2番目の例外ではDLLNotFoundExceptionSystem.ArgumentNullExceptionが発生します。
助けてくれてありがとう
アレックス
編集:
申し訳ありませんが、@ Poupouは、System.ArgumentNullExceptionをスローします。ハンドル値は0であり、ptr値は0です。
スタックトレースは次のとおりです。
System.ArgumentNullException: Argument cannot be null.
Parameter name: src
at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal:PtrToStructure (intptr,System.Type)
at AlexTouch.GoogleAdMobAds.GADAdSizeConstants.get_Banner () [0x00000] in <filename unknown>:0
at MobclixText.MobclixTextViewController.ViewDidLoad () [0x00006] in /Users/Alex/Projects/MobclixText/MobclixText/MobclixTextViewController.cs:33
at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging:void_objc_msgSend (intptr,intptr)
at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00010] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g.cs:98
at MobclixText.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x00031] in /Users/Alex/Projects/MobclixText/MobclixText/AppDelegate.cs:44
at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
at MobclixText.Application.Main (System.String[] args) [0x00000] in /Users/Alex/Projects/MobclixText/MobclixText/Main.cs:17
これはハンドルが0であるためだと思います。
コメントについて
特別なフラグの1つ(man dlsym)でdlsymを使用すると役立つ場合があります。
使い方の例を教えてください=)??
アレックス
編集2:
こんにちは@Poupouとあなたの答えに感謝しますが
IntPtr RTLD_MAIN_ONLY = (IntPtr) (-5);
IntPtr ptr = Dlfcn.GetIntPtr (RTLD_MAIN_ONLY, "kGADAdSizeBanner");
私はまだ他のアイデアptr
と同等になりますか?0
アレックス
編集3:
わかりました、今次を試しています
IntPtr RTLD_MAIN_ONLY = Dlfcn.dlopen (null, 0);
IntPtr ptr = Dlfcn.dlsym (RTLD_MAIN_ONLY, "kGADAdSizeBanner");
Console.WriteLine("RTLD_MAIN_ONLY: " + RTLD_MAIN_ONLY);
Console.WriteLine("ptr: " + ptr);
Dlfcn.dlopen (null, 0);
ここで行ったように、ハンドル値を取得しています-2
が、ネイティブリンカーがシンボルを削除していると思いますが、これを防ぐにはどうすればよいですか?
どうもありがとうございました@Poupou
アレックス