选择要使用配置链接的程序集(MonoDevelop)

时间:2013-08-21 12:53:09

标签: configuration msbuild monodevelop .net-assembly

我正在使用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以使用不同的命名空间并执行类似黑客的操作:

#ifdef __WINDOWS_VERSION__
#define Microsoft.Xna Microsoft.XnaWindowsVersion
#endif

......但话又说回来,那似乎有罪。关于我应该怎么做的任何想法?

1 个答案:

答案 0 :(得分:3)

在标准MSBuild下,您可以使用<choose>元素解决此问题:

另请参阅:https://stackoverflow.com/a/1836417/736079