MonoをGitのソースからビルドしてインストールする手順。 本文の内容は2018年05月04日時点のバージョンに基づく。
また、ビルドに使用した環境はUbuntu 18.04 LTS 64bit、本文中に掲載している所要時間はIntel Core i5-6402Pを積んだマシンで計測したもの。
ここで紹介する手順はMono本体といくつかのアセンブリをインストールするためのもの。 ディストリビューションが提供しているバージョンのMonoと共存できるようにするため、/opt/mono/master
にインストールする。
1つの環境に複数のMonoをインストールする方法についてはParallel Mono Environments - Monoで詳しく解説されている。
ビルドにはgcc、libtool、autotools、gettext、pkg-config等が必要になるので、あらかじめインストールしておく必要がある。
libgdiplus
System.Drawing.dll
など、GDI+の機能を使用する場合のみ。 不要な場合はインストールを省略できる。
依存するパッケージのインストール
ソースのチェックアウトとautogen、configure
configure
の結果例。
ビルド、インストール
configureした結果に問題が無ければmake
, make install
する。
正しくインストールできたか確認する。
LLVM
LLVMバックエンドを有効にする場合のみ。 不要な場合はインストールを省略できる。
ソースのチェックアウトとautogen、configure
ビルド、インストール
configureした結果に問題が無ければmake
, make install
する。
所要時間は以下のとおり。
Mono本体(コンパイラ、クラスライブラリ)
依存するパッケージのインストール
ソースのチェックアウトとautogen、configure
ここでは--with-llvm
を指定することでLLVMバックエンドを有効にしてビルドする。 LLVMをインストールしていない場合、あるいはLLVMを無効にする場合は、--with-llvm
を指定しない。
configure
の結果例。
ビルド、インストール
準備が整ったら、make
, make install
する。
所要時間は以下のとおり。
Monoのビルドにはmcs(C#コンパイラ)が必要になる。 コンパイルする環境にmcsが場合は、以下のコマンドで最新のMonoLite(最小構成のmcsパッケージ)を取得することでビルドできるようになる。 ただし、通常は自動でダウンロードされるため手動で行う必要はない。
MonoLiteが入手できない場合は、以下の5つのバイナリを別の環境からコピーするなどして手動で../mcs/class/lib/monolite/
に配置する。 (過去のバージョンでは有効だった手段。 現在のバージョンでも有効かどうかは未検証。)
- mscorlib.dll
- System.dll
- System.Xml.dll
- Mono.Security.dll
- mcs.exe
動作確認
新しくMonoをインストールした場合
mono -V
でmonoが動作することを確認する。
既に別のバージョンのMonoが存在する環境にインストールした場合
新しく/opt/mono/master
にインストールしたMonoを参照できるように、環境変数を設定するスクリプトを用意しておく。
まずmono -V
で既にインストールされているmonoが動作することを確認する。
続いて、先ほど用意したスクリプトを読み込んだあとでmono -V
を実行し、新しくインストールしたmonoが動作することを確認する。
GAC
gacutil2 -l
でアセンブリがGACに登録されていることを確認する。
GACのパスを明示的に指定する場合は-rootオプションで指定する。 例えばgacutil2 -l -root /opt/mono/master/lib/
など)
mcs(C#コンパイラ)・mono(Monoランタイム)
mcs(C#コンパイラ)およびmono(Monoランタイム)の動作を確認する。
MonoのC#コンパイラであるmcsは、.NET Frameworkのcscコンパイラと同じコンパイルオプションを指定してコンパイルすることができる。 コンパイルして作成した実行可能ファイルは直接実行する代わりにmono test.exe
のようにmonoコマンドを使って実行する。
LLVMバックエンドを有効にした場合の動作を確認する。 mono --llvm
とすることでLLVMバックエンドを有効にした状態でmonoランタイムを実行させることができる。
csharp(C#シェル)
csharpシェルが動作するか確認する。
csharpシェルでは、TABキーを押すことにより入力補間を行うことができる。 また型名などに続けてピリオドを入力すればメンバの一覧が表示される。
その他のアセンブリ・ライブラリ
mono-basic
VB.NETコンパイラやMicrosoft.VisualBasic.dll
を使用する場合は、mono-basicをインストールする。
ソースのチェックアウトとautogen、configure。
configure
の結果例。
問題が無ければ、make
, make install
する。
vbnc2(VB.NETコンパイラ)の動作を確認する。
MSBuild (mono/msbuild)
ビルドツールにMSBuildを使用する場合は、mono/msbuildをインストールする。
現時点ではMonoに同梱されるMSBuild互換のxbuild
を使うこともできるが、将来的にはMSBuildに置き換えられる予定となっている。
ソースのチェックアウト。
現在のブランチがxplat-master
になっていることを確認する。 (デフォルトでxplat-master
となっているはず)
make
する。 インストールパスの設定等はこの後の手順で行うことができる。
ビルド中に適宜NuGetパッケージなどのダウンロードが行われるため、時間がかかる場合がある。
ビルド中にLibGit2SharpがTypeInitializationExceptionをスローしてビルドに失敗する場合の対処法について: §.LibGit2SharpがTypeInitializationExceptionをスローする
インストールするにはmake install
ではなく、インストール用のスクリプトinstall-mono-prefix.sh
を用いる。 引数でインストール先のパスを指定することができる。 (ここでは/opt/mono/master/
にインストールしている)
動作を確認する。
トラブルシューティング
System.Drawing.dllがTypeInitializationExceptionをスローする
以下のようにSystem.Drawing.dllのメンバを参照しようとした際にTypeInitializationExceptionがスローされる場合の対処について。
上記のようにTypeInitializationExceptionがスローされ、さらにその原因として<prefix>
が見つからずにDllNotFoundExceptionがスローされている場合は、libgdiplus.so
のパス解決に失敗している。
この場合、<prefix>/etc/mono/config
を以下のように修正する。 (ここで、<prefix>
はconfigure
の--prefix
オプションで指定したインストール先のパス。 ここでは/opt/mono/master
。)
インストール先の<prefix>/etc/mono/config
を編集できない場合は、/home/user/.mono/config
に同様のファイルを配置してそこに記述することもできる。
LibGit2SharpがTypeInitializationExceptionをスローする
MSBuildのインストール中などにおいて、以下のようにLibGit2Sharp
がTypeInitializationException
をスローして実行で失敗する場合の対処について。
この場合ではlib/linux/x86_64/libgit2-1196807.so
が見つからずにDllNotFoundException
が発生している。 バージョン1.0.210のLibGit2Sharp.NativeBinaries
のNuGetパッケージにはこのファイルが含まれているが、相対パスの解決に失敗する(?)ためにDllNotFoundException
となっている模様。
対処として、libgit2
を別途インストールし、それに含まれる.soファイルをフルパスで参照するように変更する。
まず、libgit2
をインストールする。
次に、LibGit2Sharp.dll
の構成ファイルを探す。
見つかった構成ファイルを編集し、dllmap
のtarget
をインストールしたlibgit2
のものに書き換える。
/usr/lib
ではなく~/.nuget/
配下にインストールされている.soファイルのフルパスに変更しても動作すると思われるが、未検証。