【发布时间】:2010-07-26 21:14:05
【问题描述】:
由于我们的应用程序中有大量的 .resx 文件,我创建了以下 MSBuild 脚本来将所有语言 .resx 文件编译为 .resource,然后将它们嵌入到附属资源程序集中。
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Res Include = "Dialog\*.ja-JP.resx">
<Culture>ja-JP</Culture>
<Project>Dialog</Project>
</Res>
</ItemGroup>
<Target Name="Main">
<Message Text="$(destination)"/>
<CallTarget Targets="CompileResources" />
<CallTarget Targets="BuildSatelliteAssemblies" />
<CallTarget Targets="CopyToFolder" Condition="$(destination)!=''"/>
<CallTarget Targets="CleanUp" />
</Target>
<Target Name="CompileResources">
<GenerateResource Sources="@(Res)" PublicClass="true" >
<Output ItemName="Resources" TaskParameter="OutputResources"/>
</GenerateResource>
</Target>
<Target Name="BuildSatelliteAssemblies" DependsOnTargets="CompileResources">
<MakeDir Directories="%(Res.Culture)"/>
<AL OutputAssembly="%(Culture)\%(Project).resources.dll"
Version="0.0.0.0"
Culture="%(Culture)"
ProductName="%(Project)"
Title="%(Project)"
EmbedResources="@(Resources)"/>
</Target>
<Target Name="CopyToFolder" DependsOnTargets="BuildSatelliteAssemblies">
<MakeDir Directories="$(destination)\%(Res.Culture)"/>
<CreateItem Include="%(Res.Culture)\*.dll" AdditionalMetadata="Culture=%(Res.Culture)">
<Output ItemName="SatelliteAssemblies" TaskParameter="Include"/>
</CreateItem>
<Copy DestinationFolder="$(destination)\%(Culture)"
SourceFiles="@(SatelliteAssemblies)" />
</Target>
<Target Name="CleanUp">
<Delete Files="@(Resources)"/>
</Target>
</Project>
附属程序集似乎可以正确编译和嵌入,但是当我将它们与我的应用程序一起放置时,它们无法识别,并且默认恢复为默认区域性资源。如果我使用 Visual Studio 构建项目并使用它创建的程序集,它们可以正常加载。
在导致应用程序识别我的外部构建程序集时,我一定遗漏了一些东西。它们的名称都相同,大小也几乎相同。
【问题讨论】:
标签: c# msbuild localization assemblies resx