質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Q&A

0回答

1386閲覧

objective-cで書いたクラスのインスタンスが作れなくなった

otaota

総合スコア30

Xamarin

Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

0グッド

0クリップ

投稿2017/06/20 03:53

編集2017/06/22 00:37

###前提・実現したいこと
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; } } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amay077

2017/06/21 16:20

これは問題が再現する「1. Objective-C のプロジェクト」と「2. Xamarin.iOS Binding プロジェクト」とそれを使用する「3. Xamarin.iOS アプリのプロジェクト」のソースコードがないと原因は分からないかもしれませんね(Xamarin.Forms は関係ないはずです)。 「最適化を有効にせよ」というのは 2. のプロジェクトの設定で ビルド → コンパイラ → 全般オプション にあるものだと思います(Visual Studio for Mac の場合)。
otaota

2017/06/22 00:39

回答ありがとうございます。ソースをのせてみました。「最適化を有効にせよ」の部分は私が使っているのはXamarin Studioでそちらでは見つけられませんでした。両方とも引き続き調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問