読者です 読者をやめる 読者になる 読者になる

眠いしお腹すいたし(´・ω・`)

C#関連を主に書きます。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

Xamarin iOSのバインディングライブラリを組み込んだらエミュレータで動かせなかった

Xamarin iOSでネイティブのライブラリを使うためにバインディングライブラリを作ってプロジェクトに組み込んだりします。

作り方とかはこの辺を見たりします。

qiita.com

で組み込んでエミュレータで動かそうとビルドするわけですよ。エラーが発生するわけですよ。

アーキテクチャが対応してないよって。

.aファイルのサポートアーキテクチャがARMv7+ARM64だったりするわけで当然ですよね。

バインディングライブラリは参照に追加しているのでこのままではエミュレータで動かせなくなってしまう(´・ω・`)

Bindingライブラリを使っている機能は動かなくてよいからエミュレータで動作させたかったので以下のことをしました。

ちなみにバインディングライブラリは大体こんな感じで作ってます。

    public abstract class HogeBase : IHoge
    {
        public static class NativeMethods
        {
            [DllImport("__Internal")]
            public static extern void Init();

            [DllImport("__Internal")]
            public static extern void Start();

            [DllImport("__Internal")]
            public static extern void Stop();
        }

        public abstract void Start();
        public abstract void Stop();
    }

IHogeはAndroidとごにょごにょ・・・・

でXamarin iOSプロジェクトでは

    public class Hoge : HogeBase
    {
        private static Lazy<Hoge> _instance = new Lazy<Hoge>(() => new Hoge());
        public static Hoge GetInstance() => _instance.Value;
        private Hoge()
        {
            NativeMethods.Init();
        }

        public override void Start()
        {
            Debug.WriteLine("start");
            NativeMethods.Start();
        }

        public override void Stop()
        {
            Debug.WriteLine("stop");
            NativeMethods.Stop();
        }
    }

こんな感じで実装していました。

  1. 構成がDebugでプラットフォームがIPhoneSimulatorの時に__SIM__というコンパイルシンボルを追加。

  2. こんな風に書き換えちゃう

#if __SIM__
    public class Hoge : IHoge
    {
        private static Lazy<Hoge> _instance = new Lazy<Hoge>(() => new Hoge());
        public static Hoge GetInstance() => _instance.Value;
        private Hoge()
        {
            
        }
        public void Start()
        {
            Debug.WriteLine("start");            
        }
        public void Stop()
        {
            Debug.WriteLine("stop");
        }
    }
#else
    public class Hoge : HogeBase
    {
        private static Lazy<Hoge> _instance = new Lazy<Hoge>(() => new Hoge());
        public static Hoge GetInstance() => _instance.Value;
        private Hoge()
        {
            NativeMethods.Init();
        }

        public override void Start()
        {
            Debug.WriteLine("start");
            NativeMethods.Start();
        }

        public override void Stop()
        {
            Debug.WriteLine("stop");
            NativeMethods.Stop();
        }
    }
#endif

要するにIPhoneSimulatorで動かすときはバインディングライブラリを使わないっていうだけです。 参照でバインディングライブラリを追加していたとしても実際に使われなければビルドできます。

この問題ってどうやって解決すればよいか教えてください(´・ω・`)