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

问题描述 投票:1回答:1

在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并未对资源名称施加限制,因此似乎可行。

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

c# deployment msbuild embedded-resource
1个回答
3
投票

.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命名的资源。

© www.soinside.com 2019 - 2024. All rights reserved.