【问题标题】:Choosing assembly to link against using configurations (MonoDevelop)使用配置选择要链接的程序集 (MonoDevelop)
【发布时间】:2013-08-21 12:53:09
【问题描述】:

我正在使用 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

...但话又说回来,这似乎是有罪的。关于我应该如何处理这件事有什么想法吗?

【问题讨论】:

    标签: configuration msbuild monodevelop .net-assembly


    【解决方案1】:

    在标准 MSBuild 下,您可以使用 &lt;choose&gt; 元素解决此问题:

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

    【讨论】:

    • 我现在无法检查 Mono 是否遵守这一点,但我怀疑它会。
    • MsBuild alsp 以不同的方式评估其他条件。您当前的解决方案会导致在 Visua Studio 中出现多个引用,但它会构建。
    • 谢谢。我之前实际上已经尝试过,结果相同。一个小时前,我发现在解决方案设置中必须勾选一个复选框才能启用 MSBuild,所以当我弄清楚这一点时,我觉得自己像个大白痴。现在它构建了,除了一个没有被正确复制的程序集。尽管如此,多个引用现在使额外的编码变得非常令人讨厌。您是否知道是否有办法解决歧义,同时保留两个程序集的引用(这可能需要自己的问题,但我想我会把它留在这里)。
    • 您可以使用多个项目,在 Visual Studio 中,我会利用“添加为链接”功能在项目之间共享源...它仍然很乱,但可以。
    • 那很乱,但我可能别无选择。将此标记为正确答案。
    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多