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

.resx ファイルの出力パスを指定する必要があります。

Output.Project空のままにし、 でディレクトリ/パスを指定しない場合Output.File、生成されたファイルは.tt ファイル自体に依存します。

于 2013-09-24T09:57:06.493 に答える