実際、これは MSBuild でかなり可能であることがわかりました。Windows .NET 用に作成された C# プロジェクトから開始し、iOS 用にもコンパイルする場合の重要なポイントは次のとおりです。注: これは MonoDevelop では機能しません。Visual Studio でのみ機能します。これは、MonoDevelop が現在、MonoTouch 用の本格的な MSBuild 互換ビルド システムを使用していないためです。
- iOS という名前の iOS 用の新しいソリューションとプロジェクト プラットフォームを作成します。これは、MonoTouch 用にプロジェクトをコンパイルするために使用されます。これには任意の名前を付けることができますが、以下では一貫して名前を使用してください。
iOS プラットフォームの場合、NoStdLib を true に設定して、mscorlib.dll を自動的に参照しないようにします。また、Mac 上の MonoTouch インストールからコピーされた、MonoTouch dll のローカル コピーを含むディレクトリへのパスを設定します。
<PropertyGroup Condition="'$(Platform'=='iOS'">
<NoStdLib>true</NoStdLib>
<iOSLibs>c:\MonoTouch\</iOSLibs>
</PropertyGroup>`
フォルダーから参照されているすべての MonoTouch アセンブリのローカル コピーへの参照を追加します。
<ItemGroup Condition="'$(Platform'=='iOS'">
<Reference Include="mscorlib">
<HintPath>$(iOSLibs)\mscorlib.dll</HintPath>
</Reference>
<Reference Include="System">
<HintPath>$(iOSLibs)\System.dll</HintPath>
</Reference>
<Reference Include="System.Core">
<HintPath>$(iOSLibs)\System.Core.dll</HintPath>
</Reference>
<Reference Include="System.Xml">
<HintPath>$(iOSLibs)\System.Xml.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq">
<HintPath>$(iOSLibs)\System.Xml.Linq.dll</HintPath>
</Reference>
<Reference Include="monotouch">
<HintPath>$(iOSLibs)\monotouch.dll</HintPath>
</Reference>
</ItemGroup>
Visual Studio は、すべての .NET アセンブリを参照する ItemGroup を自動的に追加します。iOS 用にビルドするときに、iOSLibs フォルダーからこれらを取得するように Visual Studio/MSBuild に指示したので、条件付きで既定のアセンブリを無効にする必要があります。これにより、VS がアセンブリ参照の重複について不平を言うのを防ぎます。の最初の行を変更し、ItemGroup
次のように条件を追加します。(注: アセンブリのリストは、プロジェクトが現在参照しているものによって異なります。)
<ItemGroup Condition=" '$(Platform)' != 'iOS' ">
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
</ItemGroup>
これで準備完了です。ソリューション内のすべてのプロジェクトに対してこれを行ったら、[ソリューション] ドロップダウンから iOS を選択し、ポータブル クラス ライブラリを使用せずに、魔法のように MonoTouch バイナリ互換アセンブリをビルドできます。(これは、PCL が役に立たないという意味ではありません。確かに役に立ちますが、ここで示す手法は、より一般的に適用できます。)
MSBuild とそのかなりの能力に関するより詳細な知識は、さらに単純化するのに役立ちます。
- 上記の大部分を、すべてのプロジェクト ファイルから参照できる共通の MSBuild ファイルに移動して、重複を排除します。
- を使用してコンパイラ定数を定義
<DefineConstants>...</DefineConstants>
し、現在のソリューションと構成に基づいてコードが異なる処理を実行できるようにします。