本地化 AssemblyInfo.cs

14

我的 AssemblyInfo 包含有关我的产品、公司等的信息。当前这些数据是直接编码在 cs 文件中的:

[assembly: AssemblyCompany("My Company.")]
[assembly: AssemblyProduct("MyProduct")]
[assembly: AssemblyCopyright("Copyright © 2012 My Company, Inc. All Rights Reserved.")]
[assembly: AssemblyTrademark("MyProduct is a trademark of MyCompany Software.")]
[assembly: AssemblyCulture("")]

我希望对这些文本进行本地化,但是我无法完成以下操作:

[assembly: AssemblyCompany(Resources.MyConpany)]

有没有解决这个问题的方法?


3
这些需要在编译时确定的常量。通常我不会看到这些字符串被本地化。 - vcsjones
1
像公司名称这样的东西通常不会本地化。Microsoft在全世界都是Microsoft。 - Jon B
1
@JonB:并不完全正确;至少在软件界之外,确实有一些公司根据国家/地区使用不同的公司名称来命名其产品。尽管我同意元数据通常指示了在生产/发布软件的国家/地区使用的名称。 - O. R. Mapper
2个回答

11

是的,这是可能的。这些属性本身很少被关心语言的人读取。然而,它们也被C#编译器用于生成/win32res编译选项的默认版本。

这会影响你在资源管理器中查看程序集属性时看到的内容,使用“属性”快捷菜单项并查看详细信息选项卡。这里显示的内容不是程序集属性,Windows不知道任何有关托管程序集的信息。你看到的是嵌入在程序集中的一个非托管资源的数据。

你可以在Visual Studio中查看这些非托管资源的样子。使用文件+打开+文件并导航到示例EXE程序集。你将获得一个嵌入式资源的树形视图,一个典型的.NET程序应该至少有三个嵌入式资源。一个图标,一个使程序与UAC兼容的清单。还有一个版本资源,这是你关心的那个。打开该节点,你会看到一个ID为1的资源,标记为[Neutral]。Neutral是资源的“适用于任何语言”的版本。双击它以打开编辑器(在Express中无法工作),您可以看到如何将程序集属性映射到版本资源属性。

你需要做的是创建自己的版本的这些非托管资源,一个使用多种语言的版本。这需要编写一个.rc文件,一个资源脚本,然后由rc.exe工具(非托管资源编译器)将其编译成.res文件。然后使用“项目+属性,应用程序”选项卡,“资源文件”单选按钮告诉编译器有关它。

请注意,这有些痛苦和容易出错,rc.exe是一个喜怒无常的工具,你失去了AssemblyInfo.cs与你在Windows中看到的内容之间的直接链接,它是一个维护项目。最好的方法是使用虚拟C ++项目并使用其内置资源编辑器将其组合起来。


1
有趣!我猜通常情况下,答案很少是“不可能”或“无法完成”。 - Jakob Möllås

7
即使无法“直接”本地化您的AssemblyInfo(例如使用 Resources.MyCompany ,如您的问题中所示),您可以在实际编译之前在编译时生成完整的AssemblyInfo。
以下是一些使用免费且开源的 MSBuild Community Tasks执行此操作的示例: 这两个链接都显示了如何在单独的MSBuild文件中执行此操作,该文件用于构建解决方案,但也可以将其直接放入.csproj文件中,这意味着即使在Visual Studio中构建解决方案时,也可以创建 AssemblyInfo.cs 。
这是我的一个项目的示例,演示如何实现此操作。
(请注意,在此示例中,我不会生成整个AssemblyInfo.cs文件,而是生成只包含版本号的单独文件!) MSBuild Community Tasks调用在.csproj文件中:
  <Target Name="BeforeBuild">
    <PropertyGroup>
      <ProdVer>0.0</ProdVer>
    </PropertyGroup>
    <PropertyGroup>
      <ProdVer Condition="'$(VersionNumber)' != ''">$(VersionNumber)</ProdVer>
    </PropertyGroup>
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyVersion.cs" AssemblyVersion="$(ProdVer)" AssemblyFileVersion="$(ProdVer)" />
  </Target>
<AssemblyInfo ...这一行调用MSBuild Community Tasks创建一个名为AssemblyVersion.cs的文件,版本号设置为$(ProdVer)
$(ProdVer)在几行前设置为0.0,当存在名为$(VersionNumber)且非空的环境变量时,$(ProdVer)被设置为该值。
$(VersionNumber)则是在调用我的构建脚本之前通过在批处理文件中简单地调用set VersionNumber=1.1来设置的。

这意味着当从Visual Studio构建时,AssemblyVersion.cs将以版本号0.0创建,而通过构建脚本构建时,则使用真实的版本号(在我的示例中为1.1)。

诚然,以这种方式将本地化的公司信息放入程序集中比仅在某处调用Resources.MyCompany要更费力,但您可以按照您的需求本地化AssemblyInfo。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接