.NET(Mono)上のexeをMac向けにする備忘録

実行時のMonoのインストールを不要にする



この記事

qiita.com

を教えてもらったので,やってみました.
少しハマった部分があったのでその辺を参考にしてもらえると。


実行したシェルコマンドは以下です.

export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig
export AS="as -arch i386"
export CC="clang -arch i386 -mmacosx-version-min=10.6"

mkbundle -o Bar Foo.exe --deps --sdk /Library/Frameworks/Mono.framework/Versions/Current

otool -L Bar

元のFoo.exeという実行ファイルを,Mono無しに実行できるBarというファイルに変換できました.
パスに関するエラーが出たので,Mono Frameworkの場所を指定する--sdk以下を加えたらうまくいきました.
元のQiitaの記事ではotoolのエラーに関する記述がありましたが,そこは特に何事もなく通りました.
また,bundle化することで,*.dllが統合されるため、これらは不要になります。

わたしの場合の実際のファイル構成です.

Cannon/
├── Cannon
├── Cannon.command
├── README.txt
├── Resources.pack
└── libAltseed_core.dylib

Cannonが,mkbundleによって作られたMac向けの実行ファイルです.
以下のようなシェルスクリプトに*.commandという名前で実行権限を与えれば,ダブルクリックで実行できます.

Cannon.command

#!/bin/sh
cd `dirname $0`
./Cannon

.app形式にする



しかし上記のように複数のファイルがあると,一見してどのファイルを実行すればいいのかわかりません.
全員がREADMEを読むとは限らないからです.
また,*.commandを実行する形式だと実行時にターミナルが開いてしまって,見た目も悪いです.
そのため,これらのファイルをまとめてapp形式にします..

こちらの記事
MacOSXでシェルスクリプトを.app形式のアプリケーションにするmkapp.app - maruko2 Note.
ほぼそのままです.

以下のようなディレクトリ構造を作成すれば,あとはMacが勝手にappと認識してくれます.

Cannon.app/
├── Contents
│   ├── Info.plist
│   ├── MacOS
│   │   └── script.sh
│   └── Resources
│       ├── Cannon
│       ├── Resources.pack
│       └── libAltseed_core.dylib
└── Icon\r

ライブラリやソースは,Resourcesディレクトリ内に配置しました.

追加したファイルの内容は以下です.
Info.plistは先ほどの記事のそのままです.
script.shは,元のCannon.commandをベースに書き換えました.

Info.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>script.sh</string>
  </dict>
</plist>

script.sh

#!/bin/sh
cd `dirname $0`
cd ../Resources
./Cannon

元の記事にもありますが,シェルスクリプトには実行権限を与えてください.

$ chmod +x script.sh

appを作成したら,ダブルクリックで実行できることを確かめてください.

また,appにアイコンを設定する方法は以下の記事
support.apple.com
あるいは,こちらのサイトを使ってください.

*.dmgにしまう



こちらの記事
qiita.com
ほぼそのままなのですが,5.ディスクの作成は不要でした.OSのバージョンの違いでしょうか(2年前の記事なので).
一応,dmgを開いて,appをデスクトップにドラッグ&ドロップした後,ダブルクリックで実行できることを確かめてください.