在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没有对资源名称进行限制,所以看起来可行。
但是如何让构建引擎为我生成合理的路径名?
答案 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>