###前提・実現したいこと
Xamarin.formsからObjective-Cで実装した関数を呼ぶ際、
static関数は問題なく使えるのですが、
クラスを実体化してから使おうとしたとき、
newのタイミングで異常終了してしまいます。
ただし、Xamarin.Forms自身をバージョンアップする前は普通に使えていて
現在のバージョンにアップデートしてから使えなくなりました。
アドバイス宜しくお願いします。
###該当のソースコード
void Test() { Debug.WriteLine(XamarinTestLib.Add(2, 3));// static関数は動作する XamarinTestLib lib = new XamarinTestLib();// ここでエラー Debug.WriteLine(lib.Add2(4, 5)); }
###発生している問題・エラーメッセージ
Invalid IL code in xxxxx:.ctor(): IL_992b: stloc.0
該当のソースコードのnewのタイミングで上記のエラーメッセージが出力されます。
###試したこと
https://forums.xamarin.com/discussion/93886/system-invalidprogramexception-invalid-il-code-in-acapelattslibtest-acapelattslib-ctor-il-002b
に同じようなことが書いてありました。
一番下に回避策として「最適化を有効にせよ」みたいなことが書いてあるように見えますが、
まだ修正箇所がわからず試せていません
###補足情報(言語/FW/ツール等のバージョンなど)
<現在>
Xamarin 6.3(build 864)
Mac Note Pro
OS X Yosemite(10.10.5)
<実体化が動作していたとき>
Xamarin 6.2(build 1829)
Mac Note Pro
OS X Yosemite(10.10.5)
###追加ソース
[Xamarin(PCL)]TopPage.cs
using System; using Xamarin.Forms; namespace XFBindTest { public class TopPage : ContentPage { public TopPage() { Padding = new Thickness(20); var label = new Label { Text = "Hello ContentPage", }; var button = new Button { Text = "push", }; button.Clicked += (sender, e) => { label.Text = DependencyService.Get<IGetText>().Text; }; Content = new StackLayout { Children = { label, button, } }; } } }
[Xamarin(PCL)]IGetText.cs(インターフェイス)
using System; namespace XFBindTest { public interface IGetText { string Text { get; } } }
[Xamarin(iOS)]GetTextImplement.cs
using System; using System.Diagnostics; using XFBindTest.iOS; using XCLib; using System.Runtime.InteropServices; [assembly: Xamarin.Forms.Dependency(typeof(GetTextImplement))] namespace XFBindTest.iOS { public class GetTextImplement : IGetText { public GetTextImplement() { } public string Text { get { Debug.WriteLine(XamarinTestLib.Add(2, 3)); Debug.WriteLine(XamarinTestLib.Multi(2, 3)); #if false XamarinTestLib lib = new XamarinTestLib();// ここでエラー Debug.WriteLine(lib.Add2(4, 5)); Debug.WriteLine(lib.CalcI(128)); Debug.WriteLine(lib.CalcF(314)); Debug.WriteLine(lib.CalcS); #endif return "abcdef"; } } } }
[XCode]XamarinTestLib.h
#import <Foundation/Foundation.h> @interface XamarinTestLib : NSObject + (int)add: (int)a para:(int)b; + (int)multi: (int)a para:(int)b; - (int)Add2: (int)a para:(int)b; - (int)calcI: (int)a; - (float)calcF: (int)a; - (NSString *)calcS; @end
[XCode]XamarinTestLib.m
#import "XamarinTestLib.h" #import <UIKit/UIKit.h> @implementation XamarinTestLib + (int)add: (int)a para:(int)b { return (a + b); } + (int)multi: (int)a para:(int)b { return (a * b); } - (int)Add2: (int)a para:(int)b { return a + b; } - (int)calcI: (int)a { return a * 2; } - (float)calcF: (int)a { return a / 100.0f; } - (NSString *)calcS { return @"123456"; } @end
[ApiDefinitions.cs(Object Sharpieで生成したものを書き換えてXamarinに組み込んでいるもの)]
using System; using Foundation; using ObjCRuntime; namespace XCLib { // @interface XamarinTestLib : NSObject [BaseType (typeof(NSObject))] interface XamarinTestLib { // +(int)add:(int)a para:(int)b; [Static] [Export ("add:para:")] int Add (int a, int b); // +(int)multi:(int)a para:(int)b; [Static] [Export ("multi:para:")] int Multi (int a, int b); // -(int)Add2:(int)a para:(int)b; [Export("Add2:para:")] int Add2(int a, int b); // -(int)calcI:(int)a; [Export("calcI:")] int CalcI(int a); // -(float)calcF:(int)a; [Export("calcF:")] float CalcF(int a); // -(NSString *)calcS; [Export("calcS")] string CalcS { get; } } }
あなたの回答
tips
プレビュー