Xamarin Studio Communityを試した
iPhone持ちのC#っ子としてはVS2015でXamarin.iOS試さねばという話の予定でしたが、
— = (@unarist) 2016年7月19日
SSDを容量大きいものに買い替えるまでVS2015はお預けになりました。予習としてMac上のXamarinStudioでやります。
我が家のMac環境というとMac mini (Mid 2010)です。Core2世代最後、光学ドライブ最後のモデルです。なお光学ドライブは壊れてます。SnowLeopardだとRAM2GBがどう見ても足りない感じでしたが、Marvericks以降だとメモリ圧縮のおかげで多少マシに見えます*1。
Xamarin Studioのインストール
公式のインストーラーを使うとXamarin.Androidを除外してもAndroidSDKがインストールされてしまいます。
https://forums.xamarin.com/discussion/17253/install-ios-components-without-android
基本的にはVisualStudioと組み合わせて使う前提なので、ここにAndroidSDKは不要です。インストーラーを起動した状態で画面左上のメニューから「View Manual Installation Instructions」と辿ると各パッケージへの直リンが書いてあるので、
- Mono
- XamarinStudio
- Xamarin.iOS
をダウンロード、インストールします。
XcodeでFree Provisioningの準備・テスト
最近のMacでは年一万のお布施を払わなくても一部機能を除いて実機デバッグができるとのことなので、これを使います。細かい話は以下のサイトを見てもらうとして・・・。
XamarinのサイトにはAppleID登録してViewDetailsからCreateして・・・って書いてあったのでそのようにしましたが、上のQiitaのやり方の方が簡単かも?
なお私が試した時は「Fix Issue」を押した時に「Creating a profile requires having a device registered in the Member Center」といったエラーが出ていたのですが、これはシミュレーターが選択されていたからのようです。
上のようになっていたのを接続したデバイスに切り替えたら上手くいきました。
Xamarin Studioで試す
Communityリリース前の記事や公式ドキュメントだとXamarinアカウントの登録・ログインが必要と書かれていますが、特にログインを求められることもありませんでした。
またウィザードに沿って進めていくとBundleIDは自動設定されますが、この時AppName内の大文字は小文字に変換されてしまうようです。大文字小文字も含めてXcodeで準備したものと一致させないと Provisioning Profile が見つからないと怒られました。info.plistで修正すれば大丈夫です。
あとがき
初めてのXamarinアプリはとりあえずアラートでも表示してみるかと試したわけですが、
Actionを一つも設定せずに表示したので閉じることができないという。
あと冒頭に書いたようなMac miniでどれほど使い物になるかといえば、Xamarin StudioのSingle View Appをビルドするのに1分かかる感じです。つらい。VisualStudio併用すれば多少マシに・・・ならないかなあ。
*1:5000円も出せば4倍にできるんですが、メモリ変えただけでどれほど効果が出るのか怪しいことを思うと、必要なら新しいマシン買うべきだよなって。
Mono.Cecilだけでアセンブリをマージ
VisualStudio起動するのが面倒でLINQPadばかり使っています。小物ツールもLINQPadで書いてQueriesの中に放り込んでますし、MyExtensionsも1000行を超えています。分割したい。
こうなってくるとLINQPadからexeやdllを書き出したくなるわけです。実際のところ、LINQPadは実行時にdllを生成しているので、ちょいちょいとメタデータをいじってやればexeになります。それもMyExtensionsに入れたんですが、それはまた別の日に書くとして。
exeにしたのなら、MyExtensionsやNuGetのアセンブリも埋め込んでしまいたいところです。
アセンブリの埋め込みというとMS謹製のILMergeや、それのMono版であるILRepackが定番かと思いますが、Mono.Cecilだけでもうちょっと手軽にできないものでしょうか。
というのがこちら。あまり深く動作確認はしていません。
TypeDefやTypeRefをモジュール間で移動してるだけですね。
こういう操作では各メタデータ間の参照や整合性を保つのが面倒なものですが、Mono.Cecilはこれらの関係をオブジェクトの参照関係に置き換えてしまい、アセンブリを書き出すときに再構築してくれるので楽ちんです。
もっとも、メタデータAを参照しているところを全てメタデータBに張り替えたいと思っても、あるデータの参照元を逆引きすることはできませんし、読み取り専用だったりするとあれなんですが。実際上のコードでもいくつか強引に書き換えています。本来ならば埋め込まれたモジュールへの参照(ModuleRef)は自分のModuleDefに置き換えるべきですが、面倒なので自分自身を指すMethodRefに書き換えています。
ちなみに冒頭で紹介したILRepackもMono.Cecilを使っていますが、あちらはもっと真面目に移植しているようです。