Как .NET переименовывает мои встроенные ресурсы?

Когда я создаю файл как "встроенный ресурс", Visual Studio дает ему имя в сборке в зависимости от его пути в проекте. Например. моему файлу в cases/2013.1/colours.xml присваивается имя ресурса со спорадическими подчеркиваниями, вроде cases._2013._1.colours.xml.

Мой вопрос: как это определение определяется? Описаны ли правила? Где используется метод Visual Studio?

Изменить: я прошу, потому что я работаю с большим количеством этих вещей, и было бы полезно иметь возможность выводить имя ресурса из пути к файлу.

Ответ 1

Как описано в статье библиотеки MSDN, Resgen.exe использует правила, реализованные методом StronglyTypedResourceBuilder.VerifyResourceName(). Я просто скопирую, что говорит библиотека MSDN:

Если ключевым параметром является пустая строка (""), возвращается строка, состоящая из одного символа подчеркивания (_). Если параметр ключа не является пустой строкой, метод VerifyResourceName сравнивает каждый символ в строке с набором недопустимых токенов на основе языка, указанного параметром поставщика. Любой недопустимый символ в строке заменяется символом подчеркивания. Символы, которые будут заменены символом подчеркивания, следующие:

'' (пробел), U + 00A0 (неразрывное пространство), '.' (период), ',' (запятая), ';' (точка с запятой), '|', '~', '@', '#', '%', '^', '&', '*', '+', '-', '/', '\','<',' > ','? ',' [','] ',' (',') ',' {','} ',' '' (quote), '' ' (апостроф), ':' и '!'.

Примечание
Сильно типизированные ресурсы не позволяют использовать ключевые слова языка (такие как if, for и т.д.) В качестве имен ключей ресурсов. Тем не менее, шаблон проектирования System.CodeDom позволяет использовать ключевые слова языка, префикс ключевого слова с символом подчеркивания. Метод VerifyResourceName вызывает метод CreateValidIdentifier для обеспечения выполнения этого проекта. Например, если вы используете имя ресурса, которое совпадает с ключевым словом языка, например, для, имя отображается как _for в генерируемом строго типизированном классе ресурсов.

Посмотрев исходный код класса StronglyTypedResourceBuilder, документация верна.

Ответ 2

Я не знаю какой-либо документации о том, как сама Visual Studio генерирует имена, но я обычно предполагаю, что она совместима с алгоритмом, используемым resgen.exe для автономных сборок, который документирован здесь. Однако описанный алгоритм не работает для вашего примера (если я не интерпретирую его неправильно, он будет генерировать имя класса cases._013._.colours), поэтому либо VS реализует его неправильно, либо документация resgen неточна для конкретного случая, который вы описываете.

Ответ 3

Простые правила, которые вы можете применить к вашему примеру,...

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