2

在我们的 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>

我希望这将是它的结束,但现在每当.csproj在 Visual Studio 中加载时,项目文件都会再次更新为以前的结构,再次破坏资源文件的编译。

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

4

2 回答 2

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>
于 2013-11-21T09:56:13.377 回答
0

You need to specify an output path for the .resx file.

If you leave Output.Project empty and don't specify a directory/path in Output.File, the generated file will be DependentUpon the .tt file itself.

于 2013-09-24T09:57:06.493 回答