2013-02-05 18 views
10

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

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

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

+2

使用_因为标识符不能以数字开头(至少在C#中)。 – leppie

+3

[相关](http://stackoverflow.com/q/3605514/21567),你可能只是改变你的喜好名称。 –

+0

另请参见http://stackoverflow.com/a/10714391/1354426 – Stipo

回答

13

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

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

''(空格),U + 00A0(非空格),'。' (句号),','(逗号),';' (分号),'|','〜','@','#','%','^','&','*','+',' - ','/','\ '','<','>','?','[',']','(',')','{','}','''(quote),'''(撇号),“:”“!”。和

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

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

+0

太棒了!我应该为第二个参数提供什么? –

+1

CodeDomProvider,只需点击MSDN库链接即可。自从您为问题添加标签后,您将使用CSharpCodeProvider [c#]。这是该方法如何知道某种语言中的关键字的方法,该部分在“说明”中进行了说明。 –

+2

有趣的是,当我手动调用StronglyTypedResourceBuilder.VerifyResourceName时,得到的结果与我的程序集中的名称不同。例如bundle.config变为bundle_config,但程序集中的名称是bundle.config –

1

我不知道有关Visual Studio本身如何生成名称的任何文档,但我通常会认为它与resgen.exe用于独立构建的算法兼容,此文档记录为here。但是,所描述的算法不适用于您的示例(除非我误解它,否则它将生成类名称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 
+0

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