如果我在VS2017的新dotnetstandard 2.0 SDK项目中将新的resx文件添加到我的属性文件夹中,我看到
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Remove="Properties\foo.resx" />
</ItemGroup>
<ItemGroup>
<Compile Update="Properties\MyWords.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>MyWords.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\MyWords.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>MyWords.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
</Project>
但是,我更喜欢将此处理方式与处理普通cs文件的方式相同。项目为空,搜索文件系统。什么是 globby 方式来实现上述目标,这样当我添加新文件时,他们不会明确声明。
我的第一次尝试是
<ItemGroup>
<Compile Update="Properties\**\*.designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Properties\%(Filename).resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Properties\**\*.resx">
<Generator>ResXFileCodeGenerator</Generator>
</EmbeddedResource>
</ItemGroup>
但这不会起作用,因为
Properties\%(Filename).resx
扩展为
Properties\Foo.designer.resx
而不是
Properties\Foo.resx
答案 0 :(得分:5)
对@stijn表示感谢,我们将此解决方案更进一步,因为它缺少发布期间为了避免运行时发生磁盘IOPS而使用的EmbeddedResource
步骤。
这是一种类似的策略,也适用于嵌入式资源:
<ItemGroup>
<Compile Include="**\*.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>$([System.String]::Copy('%(FileName)').Replace('.Designer', '.resx'))</DependentUpon>
</Compile>
<EmbeddedResource Include="**\*.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>$([System.String]::Copy('%(FileName)')).Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
注释:MSBUILD Item Metadata reference is a great resource-例如它告诉您%FileName
不包括最初使我绊倒的扩展名。还有this related SO post affirms the necessity of using String.Copy
。
答案 1 :(得分:2)
您可以在元数据上使用属性函数,因此使用String.Replace删除.Designer
部分应该没问题:
<Compile Update="Properties\**\*.designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>Properties\$([System.String]::Copy('%(FileName)').Replace('.Designer', '')).resx</DependentUpon>
</Compile>