Xamarin iOSのバインディングライブラリを組み込んだらエミュレータで動かせなかった
Xamarin iOSでネイティブのライブラリを使うためにバインディングライブラリを作ってプロジェクトに組み込んだりします。
作り方とかはこの辺を見たりします。
で組み込んでエミュレータで動かそうとビルドするわけですよ。エラーが発生するわけですよ。
アーキテクチャが対応してないよって。
.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(); } }
こんな感じで実装していました。
構成がDebugでプラットフォームがIPhoneSimulatorの時に
__SIM__
というコンパイルシンボルを追加。こんな風に書き換えちゃう
#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で動かすときはバインディングライブラリを使わないっていうだけです。 参照でバインディングライブラリを追加していたとしても実際に使われなければビルドできます。
この問題ってどうやって解決すればよいか教えてください(´・ω・`)