Вопрос

Можно ли поместить файлы ресурсов (.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);
    }

}

Этот подход работает и при среднем доверии.

Кажется, что папки не имеют никакого значения при доступе к ресурсам из кода.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top