在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并未对资源名称施加限制,因此似乎可行。
但是如何让构建引擎为我生成明智的路径名?
在.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
命名的资源。