在CSPROJ中有条件地嵌入资源

时间:2013-01-08 21:26:29

标签: c# visual-studio

我正在尝试从两个不同的目录中将资源嵌入到我的CSPROJ中,具体取决于配置。 This post给了我这个想法,但它不起作用。任何帮助表示赞赏。

<Choose>
  <When Condition="'$(Configuration)' == 'Debug'">
    <ItemGroup>
      <EmbeddedResource Include="..\Debug\file.txt">
        <Link>Files\file.txt</Link>
      </EmbeddedResource>
    </ItemGroup>
  </When>
  <Otherwise>
    <ItemGroup>
      <EmbeddedResource Include="..\Release\file.txt">
        <Link>Files\file.txt</Link>
      </EmbeddedResource>
    </ItemGroup>
  </Otherwise>
</Choose>

我也试过这个,但它同样有效。

<ItemGroup>
  <EmbeddedResource Include="..\$(Configuration)\file.txt">
    <Link>Files\file.txt</Link>
  </EmbeddedResource>
</ItemGroup>

2 个答案:

答案 0 :(得分:4)

您只需将条件放在ItemGroup元素上:

<ItemGroup Condition="'$(Configuration)' == 'Debug'">
  <EmbeddedResource Include="..\Debug\file.txt">
    <Link>Files\file.txt</Link>
  </EmbeddedResource>
</ItemGroup>
<ItemGroup Condition="'$(Configuration)' == 'Release'">
  <EmbeddedResource Include="..\Release\file.txt">
    <Link>Files\file.txt</Link>
  </EmbeddedResource>
</ItemGroup>

答案 1 :(得分:3)

正如我在对你的问题的评论中所说,这对你有用:

<ItemGroup>
  <EmbeddedResource Include="..\$(Configuration)\file.txt">
    <Link>Files\file.txt</Link>
  </EmbeddedResource>
</ItemGroup>

即使您可能在VS的属性编辑器的“完整路径”中看到旧值 - 在构建时,它将尊重您当前的配置。 VS属性编辑器应该通过解决方案资源管理器的刷新按钮更新,或者在最坏的情况下重新加载项目。可能是将选择更改为其他文件并返回file.txt就足以刷新属性编辑器。

<强>更新

我已经弄清楚在哪种情况下,通过点击解决方案资源管理器的“刷新”按钮来改变我的完整路径 - 这是Dll Reference的提示路径。

<Reference Include="MyDll">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>..\$(Configuration)\MyDll.dll</HintPath>
</Reference>

仅当所有DLL(在所有目标文件夹中)确实存在时才会起作用。

由于某些原因,项目文件不刷新完整路径 - 对于文件项 VS始终认为当前配置名为Debug - 即使您从项目中删除调试配置 。幸运的是,这个VS Bug不会影响构建 - 它仍将采用有效文件。