当我将文件构建为“嵌入式资源”时,Visual Studio会根据项目中的路径为程序集中的名称指定名称。例如。我在cases/2013.1/colours.xml
的文件被赋予了一个资源名称,其中包含cases._2013._1.colours.xml
等零星的下划线。
我的问题是 - 这个名字是如何确定的?规则是否记录在案? Visual Studio使用的方法在哪里?
编辑:我问,因为我正在处理大量这些事情,能够从文件路径中推断出资源名称会很有帮助。
答案 0 :(得分:14)
如MSDN Library文章所述,Resgen.exe使用StronglyTypedResourceBuilder.VerifyResourceName() method实现的规则。我只是复制MSDN库所说的内容:
如果key参数是空字符串(“”),则返回由单个下划线字符(_)组成的字符串。如果key参数不是空字符串,则VerifyResourceName方法会根据provider参数指定的语言将字符串中的每个字符与一组无效标记进行比较。字符串中的任何无效字符都将替换为下划线字符。将用下划线替换的字符如下:
''(空格),U + 00A0(不间断空格),'。' (期间),','(逗号),';' (分号),'|','〜','@','#','%','^','&','*','+',' - ','/',' \','<','>','?','[',']','(',')','{','}',''''(引用),'' '(撇号),':'和'!'。
注意强>
强类型资源不允许使用语言关键字(例如if,for等)作为资源键名。但是,System.CodeDom设计模式允许通过在关键字前加下划线字符来使用语言关键字。 VerifyResourceName方法调用CreateValidIdentifier方法来强制执行此设计。例如,如果使用与语言关键字相同的资源名称(例如for),则名称在生成的强类型资源类中显示为_for。
查看StronglyTypedResourceBuilder类的源代码,文档是准确的。
答案 1 :(得分:1)
我不知道有关Visual Studio本身如何生成名称的任何文档,但我通常会认为它与resgen.exe用于独立构建的算法兼容,记录为here。但是,所描述的算法对你的例子不起作用(除非我误解它,它会产生一个类名cases._013._.colours
),所以VS要么不正确地实现它,要么resgen文档对于特定情况是不准确的你形容。
答案 2 :(得分: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