C# - 从汇编中获取资源字符串的最快方法

时间:2012-01-24 05:23:15

标签: c# performance resources assemblies resx

我真的不知道/有答案,知道使用c#在程序集中使用resx文件中的密钥来查找资源值。(或者我可能是无知的)。

什么是最快的代码,我可以使用资源文件中的密钥检索string valuesvalues,该资源文件在程序集中作为资源嵌入。我正在为资源文件中的异常存储友好消息,并希望在需要时使用它们。

为此目的是否存在静态类?

我可以使用开源成熟的项目吗?

7 个答案:

答案 0 :(得分:39)

如果资源与代码在同一个程序集中,则以下内容将执行:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

取自this SO answer

答案 1 :(得分:19)

Assembly assembly = this.GetType().Assembly;
ResourceManager resourceManager = new ResourceManager("Resources.Strings", assembly);
string myString = resourceManager.GetString("value");

答案 2 :(得分:9)

string val = Resources.ResourceManager.GetString("resource_name");

鉴于"resource_name",您可以检索资源值。

答案 3 :(得分:4)

您可以使用ResourceManger从Assembly

获取字符串值

Get Resource from Assembly

ResourceManager ResManager= new ResourceManager("yourResource", 
            Assembly.GetExecutingAssembly());
String strResourveValue = ResManager.GetString("YourStringKey");

答案 4 :(得分:2)

当我为名为UnitTests的C#类库的单元测试创​​建一个新项目时,我右键单击并添加了一个新资源。我将UnitTestsResources命名为。我为该资源添加了2个字符串。然后我就能够方便地访问它们

UnitTestsResources.NoDeviceRequireMsg

我很好奇这是如何工作的,所以我提取资源文件背后的代码,这是有道理的。 Visual Studio创建了一个带有静态访问器的内部类..对我来说这看起来像这样

[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class UnitTestsResources {

    //Some auto generated code

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device is required for test.
    /// </summary>
    internal static string DeviceRequireMsg {
        get {
            return ResourceManager.GetString("DeviceRequireMsg", resourceCulture);
        }
    }

    /// <summary>
    ///   Looks up a localized string similar to OPOS Device must not be installed for test.
    /// </summary>
    internal static string NoDeviceRequireMsg {
        get {
            return ResourceManager.GetString("NoDeviceRequireMsg", resourceCulture);
        }
    }
}

因为它仅适用于我的单元测试,所以我很满意。希望它可以帮助别人。

答案 5 :(得分:1)

为了改进herzbube的答案,我将展示我是如何实现这个的。

不是为资源文件创建项目或文件夹,只需右键单击您的项目并添加 - >新项目,然后选择资源文件。打开字符串中的资源文件,保存为有用的名称,然后导航到要使用它们的C#,然后它只是:

String resourceValue = MyProjectName.MyResourceFileName.MyResourceRowItem;

如果不起作用,请注意resx文件内的访问修饰符下拉列表。

答案 6 :(得分:1)

 var thread = System.Threading.Thread.CurrentThread.CurrentUICulture.Name;
            var culture = new CultureInfo(thread);
            var resourceManager = new ResourceManager(typeof(Resources.Resource));
            string value = resourceManager.GetString(name, culture);