2013-09-23 51 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>