MonoGame プロジェクトを使用して、Windows と Linux を対象としたマルチプラットフォーム ゲームに取り組んでいます。私がやりたかったのは、同じ .csproj ファイルを使用してどちらのターゲットでもビルドできるようにすることでした。これは、バージョン間で変更されるのは参照されるアセンブリだけだからです。具体的には、ターゲット プラットフォームに応じて異なるバージョンの MonoGame ライブラリにリンクする必要があります。オンラインで調べたところ、.csproj ファイルを編集することで簡単にできるようです。だから私はこのようなことをしました:
<!-- System agnostic dependencies -->
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
...
</ItemGroup>
<!-- Linux system dependencies -->
<ItemGroup Condition=" '$(Configuration)'=='Linux' ">
<Reference Include="MonoGame.Framework">
<HintPath>..\Dependencies\Linux\MonoGame.Framework.dll</HintPath>
</Reference>
</ItemGroup>
<!-- Windows system dependencies -->
<ItemGroup Condition=" '$(Configuration)'=='Windows' ">
<Reference Include="MonoGame.Framework.Windows">
<HintPath>..\Dependencies\Windows\MonoGame.Framework.Windows.dll</HintPath>
</Reference>
</ItemGroup>
(他の依存関係は簡潔にするために省略されています)
うーん、これはまったく機能しません。Linux 構成でビルドしようとすると、MonoGame アセンブリの名前空間に含まれるすべての型が複数回定義されているというメッセージがすぐに表示されます。アセンブリには2つのバージョンがあるため、明らかにこれは真実ですが、.csprojの条件では、アセンブリの適切なバージョンに対してのみリンクしようとする必要があることを理解していました. 出力ディレクトリを確認したところ、いずれかの構成のすべての依存関係が出力にコピーされました。だから明らかに私はここで何か間違ったことをしています。
私が見つけたオンライン ドキュメントは、MonoDevelop が MSBuild 条件ステートメントを少なくともある程度サポートしていることを示していますが、それ以上の具体的なものは見つかりませんでした。私がやろうとしていることが MonoDevelop でまったくサポートされていないか、本当にばかげたことをしています。
私がやろうとしていることがサポートされていない場合、いつでも Windows バージョンの MonoGame を再コンパイルして別の名前空間を使用し、ハックのようなことを行うことができると考えました。
#ifdef __WINDOWS_VERSION__
#define Microsoft.Xna Microsoft.XnaWindowsVersion
#endif
...しかし、それはまた罪深いようです。これについてどうすればよいかについてのアイデアはありますか?