14

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

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

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

4

3 回答 3

19

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

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

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

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

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

于 2013-05-11T13:33:55.097 回答
1

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

于 2013-02-06T01:40:33.080 回答
0

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

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
于 2013-05-11T13:04:42.090 回答