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

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

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

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

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

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

”(空格),U + 00A0(不间断空格),’。’ (期间),’,’(逗号),’;’ (分号),’|’,’〜’,’@’,’#’,’%’,’^’,’&’,’*’,’+’,’ – ‘,’/’,’\ ‘,”’,’>’,’?’,'[‘,’]’,’(’,’)’,'{‘,’}’,”’(引用),””(撇号),’:’和’!’。

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

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

我不知道有关Visual Studio本身如何生成名称的任何文档,但我通常会认为它与resgen.exe用于独立构建的算法兼容,这将在此处记录 。 但是,所描述的算法不适用于您的示例(除非我误解它,它会生成一个类名称为cases._013._.colours ),因此要么VS实现错误,要么resgen文档不准确您描述的具体案例。

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

 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