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)]

有没有解决的办法 ?

4

2 回答 2

11

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

这会影响您在资源管理器中查看装配属性时看到的内容,使用属性快捷菜单项并查看详细信息选项卡。Windows 在这里显示的不是程序集属性,它对托管程序集一无所知。您看到的是嵌入在程序集中的非托管资源中的数据。

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

您需要做的是为这些非托管资源创建自己的版本,即使用多种语言的版本。这需要编写一个 .rc 文件,一个资源脚本,然后由 rc.exe 工具(非托管资源编译器)编译成一个 .res 文件。然后,您使用 Project + Properties,Application 选项卡,“Resource File”单选按钮告诉编译器它。

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

于 2012-12-07T02:16:24.177 回答
7

即使不可能“直接”本地化您的 AssemblyInfo(例如Resources.MyCompany,如您的问题所示使用),您可以做的是在编译时生成完整的 AssemblyInfo,然后再进行实际编译。

以下是一些如何使用免费和开源的MSBuild 社区任务执行此操作的示例:

这两个链接都显示了如何在一个单独的 MSBuild 文件中执行此操作,该文件被称为构建解决方案,但也可以将其直接放在 .csproj 文件中,这意味着AssemblyInfo.cs在 Visual Studio 中构建解决方案时甚至可以创建。

这是我的一个项目中的一个示例,如何做到这一点。
(请注意,在这个例子中我没有生成整体AssemblyInfo.cs,而是一个只包含版本号的单独文件!)

MSBuild 社区任务调用位于.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 社区任务来创建一个文件AssemblyVersion.cs,版本号设置为$(ProdVer).
$(ProdVer)之前设置为0.0几行,当有一个名为的环境变量$(VersionNumber)不为空时,$(ProdVer)设置为该值。
$(VersionNumber)在调用我的构建脚本之前通过简单地调用set VersionNumber=1.1批处理文件进行设置。

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

当然,以这种方式将您的本地化公司信息放入程序集中比仅仅在Resources.MyCompany某个地方调用更多工作,但可以根据需要对 AssemblyInfo 进行本地化。

于 2012-12-06T22:12:17.017 回答