2013-09-23 56 views
2

在我们的Web应用程序中,我选择iu-Cans-CA区域设置作为伪字段,其中字符串资源关键字也用作值。这是为自动化测试提供帮助。要为此语言环境生成.resx,我正在使用T4模板。获取T4生成的.resx文件以生成

.resx生成正确,但有些错误:资源文件没有像其他编译到程序集中real翻译是。我终于找出原因。由于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> 

我希望这将是它的结束,但现在每当.csproj在Visual Studio中加载,项目文件再次更新到前一个结构,再次打破资源文件的编译。

有没有办法修复东西,以便生成/依赖.resx作为嵌入资源正确编译?或者有没有办法永久打破依赖关系,因此它不会得到恢复?我意识到我可以重写.tt,因此它会生成一个不同名称的文件,但是我宁愿找到一个不需要这个的解决方案,因为这是T4的非典型用法,我想避免太多的WTF。

+0

Bah,在Connect网站上关闭为“无法修复”。有时候我想知道为什么我打扰向黑洞提交错误:https://connect.microsoft.com/VisualStudio/feedback/details/801997/t4-generated-resx-files-not-compiling – Jacob

回答

0

您需要为.resx文件指定输出路径。

如果你离开Output.Project空,不Output.File指定目录/路径,生成的文件将是DependentUpon的.TT文件本身。

+0

'Output.Project'和'Output.File'指定?你可以发布一些代码吗?我不确定你指的是什么。 – Jacob

+0

您需要T4 Toolbox。见[这里](http://www.olegsych.com/2009/03/t4-toolbox-generating-files-in-different-folders-and-projects/)。我以为你使用它是因为你提到了模板。 – shamp00

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>