我正在使用 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 程序集的命名空间中包含的所有类型都被定义了多次。显然这是真的,因为程序集有两个版本,但我的理解是,在 .csproj 中的条件下,它应该只尝试链接到程序集的适当版本。我检查了输出目录,它甚至继续将任一配置的所有依赖项复制到输出中。所以很明显我在这里做错了什么。
我找到的在线文档表明 MonoDevelop 至少对 MSBuild 条件语句有一些支持,但我找不到更具体的东西。MonoDevelop 根本不支持我正在尝试做的事情,或者我正在做一些非常愚蠢的事情。
我想如果不支持我正在尝试做的事情,我总是可以重新编译 Windows 版本的 MonoGame 以使用不同的命名空间并做一些 hack-y 之类的事情:
#ifdef __WINDOWS_VERSION__
#define Microsoft.Xna Microsoft.XnaWindowsVersion
#endif
...但话又说回来,这似乎是有罪的。关于我应该如何去做的任何想法?