【问题标题】:How is .NET renaming my embedded resources?.NET 如何重命名我的嵌入式资源?
【发布时间】:2014-11-07 21:20:46
【问题描述】:

当我将文件构建为“嵌入式资源”时,Visual Studio 会根据其在项目中的路径在程序集中为其命名。例如。我在cases/2013.1/colours.xml 的文件被赋予了一个带有零星下划线的资源名称,例如cases._2013._1.colours.xml

我的问题是 - 这个名字是如何确定的?规则是否记录在案? Visual Studio 使用的方法在哪里?

编辑:我问是因为我正在处理大量这些事情,并且能够从文件路径中推断出资源名称会很有帮助。

【问题讨论】:

标签: c# .net visual-studio


【解决方案1】:

如 MSDN 库文章所述,Resgen.exe 使用由 StronglyTypedResourceBuilder.VerifyResourceName() method 实施的规则。我将复制 MSDN 库所说的内容:

如果 key 参数为空字符串 (""),则返回由单个下划线字符 (_) 组成的字符串。如果 key 参数不是空字符串,VerifyResourceName 方法会根据 provider 参数指定的语言将字符串中的每个字符与一组无效标记进行比较。字符串中的任何无效字符都将替换为下划线字符。将被下划线替换的字符如下:

' ' (空格), U+00A0 (不间断空格), '.' (句号), ',' (逗号), ';' (分号)、'|'、'~'、'@'、'#'、'%'、'^'、'&'、'*'、'+'、'-'、'/'、'\ ', '', '?', '[', ']', '(', ')', '{', '}', '"' (引号), ''' (撇号)、':' 和 '!'。

注意
强类型资源不允许使用语言关键字(例如 if、for 等)作为资源键名。但是,System.CodeDom 设计模式允许通过在关键字前加上下划线字符来使用语言关键字。 VerifyResourceName 方法调用 CreateValidIdentifier 方法来强制执行此设计。例如,如果您使用与语言关键字相同的资源名称,例如 for,则该名称在生成的强类型资源类中显示为 _for。

查看StronglyTypedResourceBuilder类的源码,文档是准确的。

【讨论】:

  • 太棒了!我应该为第二个参数输入什么?
  • 一个 CodeDomProvider,只需点击 MSDN 库链接。自从您标记了您的问题 [c#] 以来,您将使用 CSharpCodeProvider。这就是该方法如何了解语言中的关键字的方式,注释中解释了该部分。
  • 有趣的是,当我手动调用 StronglyTypedResourceBuilder.VerifyResourceName 时,我得到的结果与程序集中的名称不同。例如 bundle.config 变成 bundle_config 但程序集中的名称是 bundle.config
  • @DavidHayes,您必须将算法分别应用于每个标识符组件。在“.”上拆分聚合标识符字符串,在每个部分上调用VerifyResourceName,然后将转义部分与“.”重新连接在一起。
  • 另外值得指出的是,如果您的资源在文件夹中,并且该文件夹以数字开头,那么该文件夹也将带有下划线前缀。
【解决方案2】:

我不知道任何有关 Visual Studio 本身如何生成名称的文档,但我通常会假设它与 resgen.exe 用于独立构建的算法兼容,该算法记录在 here 中。但是,所描述的算法不适用于您的示例(除非我误解了它,否则它会产生一个类名 cases._013._.colours),因此 VS 错误地实现了它,或者 resgen 文档对于您描述的特定情况不准确.

【讨论】:

    【解决方案3】:

    您可以应用于示例的简单规则是...

    cases/2013.1/colours.xml
    

    1) 将“/”替换为“.”

    cases.2013.1.colours.xml
    

    2) 对于点分隔字符串中的每个项目,如果项目以数字开头,则在其前面加上下划线。

    cases => cases
    2013 => _2013
    1 => _1
    colours => colours
    xml => xml
    

    3) 重新组合字符串,用点分隔。

    cases._2013._1.colours.xml
    

    【讨论】:

    • 这样做的原因是资源的名称必须与代码符号兼容——因此数字需要添加一个字母字符或下划线作为前缀,以使其成为有效符号(变量名称) .最好的方法是使用不需要更改的名称,例如“2012 年”而不是“2012”。这样,名称将以非常简单的方式翻译(斜线替换为点)。
    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 2011-10-30
    • 2017-11-18
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多