如何为Embeeded Resources更改生成的ManifestResourceName

时间:2017-05-30 20:37:27

标签: c# deployment msbuild embedded-resource

在C#项目中,默认情况下生成的Embedded Resource资源名称会经过一些修改,以使结果名称成为命名空间的有效语言标识符。

例如Foo/Bar/123.txt变为{Default Namespace}.Foo.Bar._123.txt,我必须使用asm.GetManifestResourceStream("Yuck.Foo.Bar._123.txt")加载它。

我宁愿让我的资源保留其相对路径,例如Foo/Bar/123.txt,以更好地模拟虚拟文件系统,因此我可以加载它们,例如asm.GetManifestResourceStream("Foo/Bar/123.txt")

现在我知道.Net没有对资源名称进行限制,所以看起来可行。

但是如何让构建引擎为我生成合理的路径名?

2 个答案:

答案 0 :(得分:2)

.csproj文件中,Embedded Resources被定义为<EmbeddedResource>个项目。

这些元数据名为<LogicalName>,允许覆盖资源名称,否则将生成任何内容。

例如:

<ItemGroup>
  <EmbeddedResource Include="Foo\Bar\123.txt">
    <LogicalName>Foo\Bar\123.txt</LogicalName>
  </EmbeddedResource>
</ItemGroup>

会生成一个可以使用asm.GetManifestResourceStream("Foo\Bar\123.txt")

加载的资源

为了对所有嵌入式资源执行此操作,我们可以向.csproj文件添加重命名任务,该文件在生成默认名称之前运行,并明确指定我们选择的名称:

<Target Name="ModifyEmbeddedResourceNames" BeforeTargets="CreateManifestResourceNames">
  <ItemGroup>
    <EmbeddedResource>
      <LogicalName>%(EmbeddedResource.Identity)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>

通过这个,我们获得了Identity命名的资源。

答案 1 :(得分:0)

如果您使用“新风格”(又名“SDK 风格”).csproj 文件,那么您可以利用 of new behaviour in MSBuild that allows properties on MSBuild Items to be specified as attributes instead of as child elements

所以不要这样做:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <!-- etc -- >

  <ItemGroup>
    <EmbeddedResource Include="Foo/Bar/123.txt">
      <LogicalName>FooBar123Txt</LogicalName>
    </EmbeddedResource>
  </ItemGroup>

</Project>

您现在可以这样做:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <!-- etc -- >

  <ItemGroup>
    <EmbeddedResource Include="Foo/Bar/123.txt" LogicalName="FooBar123Txt" />
  </ItemGroup>

</Project>