Действительно ли возможно поместить файлы ресурсов (.resx) в подпапках в App_GlobalResources?
Например:
/App_GlobalResources/someresources/myfile.resx
/App_GlobalResources/someresources/myfile.fr-fr.resx
/App_GlobalResources/othereresources/otherfile.resx
/App_GlobalResources/othereresources/otherfile.fr-fr.resx
Или, все .resx файлы помещаются непосредственно в App_GlobalResources?
Если возможно использовать подпапки, как Вы программно получаете доступ к ресурсам в подпапках?
Технически да, это возможно, но есть некоторые подводные камни. Во-первых, позвольте мне показать вам пример. Предположим, моя папка App_GlobalResources
выглядит так:
/App_GlobalResources
/Test
TestSubresource.resx
TestResource.resx
Каждый файл ресурсов имеет одну запись с именем «TestString». Я добавил каждый файл ресурсов с помощью меню Visual Studio, поэтому он создал для меня класс. По умолчанию все классы, добавленные в папку App_GlobalResources
, будут иметь одно и то же пространство имен Resource
. Итак, если я хочу использовать генератор классов и хочу Test
в пространстве имен, мне нужно перейти в файл TestSubresource.Designer.cs и вручную изменить пространство имен.Как только я это сделаю, я могу сделать следующее:
var rootResource = Resources.TestResource.TestString;
var subResource = Resources.Test.TestSubResource.TestString;
Я также могу ссылаться на них, используя GetGlobalResourceObject
:
var rootResource = GetGlobalResourceObject( "TestResource", "TestString" );
var subResource1 = GetGlobalResourceObject( "TestSubresource", "TestString" );
Обратите внимание, что я все еще использую «TestSubresource» как средство ссылки на ресурсы в этом файле. даже если он находится во вложенной папке. Теперь одна из ловушек заключается в том, что все файлы должны быть уникальными во всех папках в App_GlobalResources
, иначе ваш проект выдаст ошибку времени выполнения. Если я добавлю ресурс с именем "TestResource.resx" в / Test, он выдаст следующую ошибку времени выполнения:
Файл ресурсов '/App_GlobalResources/TestResource.resx' не может быть использован, так как он конфликтует с другой файл с таким же именем.).
Это верно, даже если я изменю пространство имен нового ресурса.
Итак, в заключение, да, это возможно, но вы увеличиваете шансы получить ошибку времени выполнения из-за двух файлов ресурсов с одинаковыми именами в разных частях структуры папок App_GlobalResources
, что разрешено файлом система, но не .NET.
Это возможно. По крайней мере, мне это удалось.
На веб-сайте я добавил папку App_GlobalResources. Внутри него я создал еще одну папку "MyFolder" и поместил внутрь файл MyResource.resx. Resx файл содержал одну пару MyKey1 - MyValue1.
Используя метод GetResource
следующего класса, я успешно извлек "MyValue1" для name="MyKey1"
static class Class1 {
static Assembly FindGlobalResAssembly() {
foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
if(asm.FullName.StartsWith("App_GlobalResources."))
return asm;
}
return null;
}
public static object GetResource(string name) {
Assembly asm = FindGlobalResAssembly();
if(asm == null)
return null;
return new ResourceManager("Resources.MyResource", asm).GetObject(name);
}
}
Этот подход работает и в среднем доверии.
Похоже, что папки не имеют никакого значения при доступе к ресурсам из кода.