【问题标题】:How to change the generated ManifestResourceName for Embedded Resources如何更改为嵌入式资源生成的 ManifestResourceName
【发布时间】:2017-10-31 11:23:32
【问题描述】:

在 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】:

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

【讨论】:

    【解决方案2】:

    如果您使用“新样式”(又名“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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多