如何更改嵌入式资源生成的ManifestResourceName

M.S*_*amm 3 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对资源名称没有限制,所以看起来可行。

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

M.S*_*amm 6

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

它们具有命名的元数据<LogicalName>,允许覆盖原本生成的资源名称。

例如:

<ItemGroup>
  <EmbeddedResource Include="Foo\Bar\123.txt">
    <LogicalName>Foo\Bar\123.txt</LogicalName>
  </EmbeddedResource>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

将生成一个可以使用加载的资源asm.GetManifestResourceStream("Foo\Bar\123.txt")

要对所有嵌入式资源执行此操作,我们可以向 .csproj 文件添加一个重命名任务,该任务在生成默认名称之前运行并显式分配我们选择的名称:

<Target Name="ModifyEmbeddedResourceNames" BeforeTargets="CreateManifestResourceNames">
  <ItemGroup>
    <EmbeddedResource>
      <LogicalName>%(EmbeddedResource.Identity)</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)

这样我们就可以获得以它们命名的资源Identity