.NET如何重命名我的嵌入式资源?

14

当我将一个文件构建为“嵌入式资源”时,Visual Studio会根据它在项目中的路径给它分配一个名称。例如,我的文件位于 cases/2013.1/colours.xml ,它会被分配一个带有间隔不规则下划线的资源名称,类似于 cases._2013._1.colours.xml

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

编辑:我之所以问,是因为我正在处理大量的这些东西,如果能够从文件路径推导出资源名称会很有帮助。


2
使用下划线是因为标识符不能以数字开头(至少在C#中是这样)。 - leppie
3
相关链接,你可以根据自己的喜好更改名称。 - Christian.K
请参见https://dev59.com/0Wgv5IYBdhLWcg3wSe0f#10714391。 - Stipo
3个回答

19
根据MSDN Library文章记录,Resgen.exe使用StronglyTypedResourceBuilder.VerifyResourceName()方法实现的规则。我将只复制MSDN库中的内容:
如果key参数是一个空字符串(""),则返回一个由单个下划线字符(_)组成的字符串。如果key参数不是一个空字符串,则VerifyResourceName方法会将字符串中的每个字符与由provider参数指定的语言基础上的一组无效标记进行比较。字符串中的任何无效字符都将被替换为下划线字符。将被替换为下划线的字符如下所示:' '(空格)、U+00A0(不间断空格)、'.'(句号)、','(逗号)、';'(分号)、'|'、'~'、'@'、'#'、'%'、'^'、'&'、'*'、'+'、'-'、'/'、'\'、'<'、'>'、'?'、'['、']'、'('、')'、'{'、'}'、'"'(引号)、'''(撇号)、':'和'!'。
注意:强类型资源不允许使用语言关键字(例如if、for等)作为资源键名。但是,System.CodeDom设计模式允许在关键字前面加下划线字符来使用语言关键字。VerifyResourceName方法调用CreateValidIdentifier方法来执行此设计。例如,如果您使用与语言关键字相同的资源名称,例如for,则该名称将在生成的强类型资源类中显示为_for。

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


太好了!第二个参数应该填什么? - Colonel Panic
1
一个CodeDomProvider,只需单击MSDN库链接即可。由于您标记了问题[c#],因此您将使用CSharpCodeProvider。这就是该方法如何了解语言中的关键字,这部分在注释中解释。 - Hans Passant
2
有趣的是,当我手动调用StronglyTypedResourceBuilder.VerifyResourceName时,我得到的结果与我的程序集中的名称不同。例如,bundle.config变成了bundle_config,但程序集中的名称是bundle.config。 - David Hayes
2
@DavidHayes,你必须将算法分别应用于每个标识符组件。将聚合标识符字符串拆分为“.”,对每个部分调用VerifyResourceName,然后使用“.”将转义的部分重新连接在一起。 - Monroe Thomas
1
值得一提的是,如果您的资源位于一个以数字开头的文件夹中,那么该文件夹也将被添加下划线前缀。 - Sam Holder
似乎文件夹名称和文件名称有不同的处理方式。文件夹名称中的空格将被替换为下划线,而文件名中的空格将被保留。有什么线索吗? - Benoittr

1
我不知道 Visual Studio 本身生成名称的文档,但我通常会假设它与独立构建时 resgen.exe 使用的算法兼容,该算法在此处文档有说明。但是,所描述的算法无法为您的示例工作(除非我误解了它,否则它会产生一个类名 cases._013._.colours),因此要么 VS 实现不正确,要么 resgen 文档对于您描述的特定情况不准确。

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

这是因为资源的名称必须与代码符号兼容,因此数字需要添加字母字符或下划线作为前缀,以使它们成为有效符号(变量名)。最好的方法是使用不需要更改的名称,例如“Year2012”而不是“2012”。这样,名称将以非常简单的方式进行翻译(斜杠替换为点)。 - Jason Williams

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