3

.NET と Monotouch の間でのコードの再利用は、さまざまな方法で対処されてきましたが、ほとんどの手法には、プロジェクト/ソリューションの並列セットが含まれます。

選択したプラットフォームと構成に基づいて、単一の csproj ファイル (.NET または同じアセンブリの MonoTouch バージョン)を使用してビルドできるかどうかを明確にするために、この質問をしたいと思います。

次のことを前提とします。

  1. ビルド マシンは Windows を実行します。
  2. Visual Studio と MSBuild が利用可能です。
  3. MonoDevelop では現在、MonoTouch に対して XBuild/MSBuild が有効になっていないため、このメソッドを MonoDevelop で動作させる必要はありません。
  4. 有効な MonoTouch インストールの MonoTouch バイナリが利用可能です。
  5. 完全なアプリではなく、ライブラリのみを構築する必要があります。このライブラリ:
    1. .xib または plist は含まれません。
    2. 条件付きでコンパイルされるプラットフォーム固有のコードを使用します。
    3. プラットフォーム固有のアセンブリを (必然的に) 参照します。これらは .csproj ファイルで処理する必要があります。

質問: これらの仮定を考えると、ライブラリは

  1. Windows .NET または
  2. バイナリが Mac にコピーされた後、MonoTouch アプリ ソリューションによる直接参照用にコンパイルされます。

現在の Visual Studio プラットフォームと構成に基づいていますか?

最新の研究

  1. Windows でコンパイルされたポータブル ライブラリを MonoTouch ソリューションで使用できるという事実は、これが可能であるという希望を与えます。
  2. System、System.Core、System.Xml などの<NoStdLib>true</NoStdLib> さまざまな s とともに、MonoTouch のビルド中に .csproj で を使用する必要があるようです。HintPath
  3. MonoTouch のビルド中に mscorlib の正しいバージョンを参照する方法がわからない。
4

2 に答える 2

3

実際、これは MSBuild でかなり可能であることがわかりました。Windows .NET 用に作成された C# プロジェクトから開始し、iOS 用にもコンパイルする場合の重要なポイントは次のとおりです。注: これは MonoDevelop では機能しません。Visual Studio でのみ機能します。これは、MonoDevelop が現在、MonoTouch 用の本格的な MSBuild 互換ビルド システムを使用していないためです。

  1. iOS という名前の iOS 用の新しいソリューションとプロジェクト プラットフォームを作成します。これは、MonoTouch 用にプロジェクトをコンパイルするために使用されます。これには任意の名前を付けることができますが、以下では一貫して名前を使用してください。
  2. iOS プラットフォームの場合、NoStdLib を true に設定して、mscorlib.dll を自動的に参照しないようにします。また、Mac 上の MonoTouch インストールからコピーされた、MonoTouch dll のローカル コピーを含むディレクトリへのパスを設定します。

    <PropertyGroup Condition="'$(Platform'=='iOS'">
      <NoStdLib>true</NoStdLib>
      <iOSLibs>c:\MonoTouch\</iOSLibs>
    </PropertyGroup>`
    
  3. フォルダーから参照されているすべての 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>
    
  4. 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 とそのかなりの能力に関するより詳細な知識は、さらに単純化するのに役立ちます。

  1. 上記の大部分を、すべてのプロジェクト ファイルから参照できる共通の MSBuild ファイルに移動して、重複を排除します。
  2. を使用してコンパイラ定数を定義<DefineConstants>...</DefineConstants>し、現在のソリューションと構成に基づいてコードが異なる処理を実行できるようにします。
于 2013-02-12T20:59:52.463 に答える
1

技術的には、 https://github.com/jbevain/cecilなどのツールを使用して、生成されたアセンブリを別のプラットフォームを対象とするように書き換えることができるはずですが、(膨大な) 努力をする価値はないと思います。分解と再構築は、別の (費用のかかる) オプションです。

質問がサード パーティによって提供されたアセンブリのリターゲットに関するものであり、これが唯一の計画である場合は、ライセンス条項に違反していないことを確認してください。

ここで、仮定の一部を取り除き、別のビルド システム (rake や make など) を使用することができれば、PCL を使用せずにビルドファイル レベルでコードを共有することもできます。

それが役に立てば幸い。

于 2013-02-08T08:35:06.187 に答える