Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET如何重命名我的嵌入式资源?_C#_.net_Visual Studio - Fatal编程技术网

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

C# NET如何重命名我的嵌入式资源?,c#,.net,visual-studio,C#,.net,Visual Studio,当我将文件构建为“嵌入式资源”时,VisualStudio会根据其在项目中的路径在程序集中为其命名。例如,我位于cases/2013.1/colors.xml的文件中有一个资源名,其中有一些零星的下划线,如cases.\u 2013.\u 1.colors.xml 我的问题是——这个名字是如何确定的?规则是否有文件记录?VisualStudio使用的方法在哪里 编辑:我问这个问题是因为我正在处理大量这些事情,如果能够从文件路径推断出资源名称,那将很有帮助。我不知道Visual Studio本身如

当我将文件构建为“嵌入式资源”时,VisualStudio会根据其在项目中的路径在程序集中为其命名。例如,我位于
cases/2013.1/colors.xml
的文件中有一个资源名,其中有一些零星的下划线,如
cases.\u 2013.\u 1.colors.xml

我的问题是——这个名字是如何确定的?规则是否有文件记录?VisualStudio使用的方法在哪里


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

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

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

cases/2013.1/colours.xml
1) 将“/”替换为“.”

2) 对于点分隔字符串中的每个项目,如果项目以数字开头,请在其前面加下划线

cases => cases
2013 => _2013
1 => _1
colours => colours
xml => xml
3) 重新组合字符串,以点分隔

cases._2013._1.colours.xml

如MSDN Library文章所述,Resgen.exe使用由实现的规则。我将复制MSDN库中的内容:

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

''(空格),U+00A0(不间断空格),'(句点),'(逗号),;'(分号),|,",",",",",",",",",",",",","",""百分,",",",,",,"和""

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


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

\u之所以使用,是因为标识符不能以数字开头(至少以C开头),您可以根据自己的喜好更改名称。另请参阅原因是资源的名称必须与代码符号兼容-因此数字需要添加字母或下划线作为前缀,以使其成为有效的符号(变量名称)。最好的方法是使用不需要更改的名称,例如。“Year2012”而不是“2012”。这样,名称将以一种非常简单的方式进行翻译(斜线替换为点)。太好了!我应该为第二个参数设置什么?一个CodeDomProvider,只需单击MSDN库链接。您将使用CSharpCodeProvider,因为您标记了您的问题[c]。这就是该方法如何知道语言中的关键字,注释中解释了该部分。有趣的是,当我手动调用StronglyTypedResourceBuilder.VerifyResourceName时,我得到的结果与程序集中的名称不同。例如,bundle.config变为bundle\u config,但程序集中的名称是bundle。config@DavidHayes,你必须申请算法分别分配到每个标识符组件。在“.”上拆分聚合标识符字符串,在每个部分上调用
VerifyResourceName
,然后将转义部分与“.”连接在一起。同样值得指出的是,如果您的资源位于文件夹内且该文件夹以数字开头,则该文件夹将以wi为前缀它也有下划线。
cases._2013._1.colours.xml