在我们的Web应用程序中,我将iu-Cans-CA
语言环境作为伪语言环境加入,其中字符串资源键也用作值。这是为自动化测试提供帮助。要为此区域设置生成.resx
,我使用的是T4模板。
.resx
生成正确,但出了点问题:资源文件没有像其他真正的翻译那样被编译到程序集中。我终于找到了原因。由于T4模板用于生成.resx
,因此.csproj
包含以下内容:
<EmbeddedResource Include="Strings.iu-Cans-CA.resx">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Strings.iu-Cans-CA.tt</DependentUpon>
</EmbeddedResource>
出于某种原因,这阻止了.resx
的编译。如果我将.csproj
更新为此,则 编译:
<EmbeddedResource Include="Strings.iu-Cans-CA.resx">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</EmbeddedResource>
我希望这将是它的结束,但现在只要在Visual Studio中加载.csproj
,项目文件就会再次更新为前一个结构,再次打破资源文件的编译。
有没有办法解决问题,以便生成/依赖.resx
正确编译为嵌入式资源?或者有没有办法永久打破依赖关系,所以它不会继续恢复?我意识到我可以重写.tt
所以它生成一个具有不同名称的文件,但我更愿意找到一个不需要这个的解决方案,因为这是T4的非典型用法,我想避免太多WTFs。
答案 0 :(得分:2)
解决方法是在构建真正开始之前从T4生成的EmbeddedResource元素中剥离DependentUpon元数据。我项目文件中对BeforeBuild目标的以下修改对我有用:
<Target Name="BeforeBuild">
<!-- Fix MSBuild issue where T4 generated .RESX files do not get compiled properly into satellite assemblies -->
<ItemGroup>
<GeneratedEmbeddedResource Include="@(EmbeddedResource)" Condition="'%(EmbeddedResource.DependentUpon)' != ''">
<DependentUpon></DependentUpon>
</GeneratedEmbeddedResource>
<EmbeddedResource Remove="@(EmbeddedResource)" Condition="'%(EmbeddedResource.DependentUpon)' != ''"/>
<EmbeddedResource Include="@(GeneratedEmbeddedResource)" />
</ItemGroup>
</Target>
答案 1 :(得分:0)
您需要为.resx文件指定输出路径。
如果您将Output.Project
留空并且未在Output.File
中指定目录/路径,则生成的文件将 DependentUpon .tt文件本身。