我正在使用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以使用其他 namespace ,并做一些类似hack-y的操作:
#ifdef __WINDOWS_VERSION__
#define Microsoft.Xna Microsoft.XnaWindowsVersion
#endif
...但是话又说回来,那似乎是有罪的。关于我应该如何处理的任何想法?
最佳答案
在标准MSBuild下,您可以使用<choose>
元素解决此问题:
另请参阅:https://stackoverflow.com/a/1836417/736079
关于configuration - 选择程序集以链接使用配置(MonoDevelop),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18357967/