是否可以将资源文件 (.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

使用以下I类成功地提取 “MyValue1” 为名字的GetResource方法= “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