Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-从程序集获取资源字符串的最快方法_C#_Performance_Resources_Assemblies_Resx - Fatal编程技术网

C#-从程序集获取资源字符串的最快方法

C#-从程序集获取资源字符串的最快方法,c#,performance,resources,assemblies,resx,C#,Performance,Resources,Assemblies,Resx,我真的不知道/不知道答案,知道如何使用c#在程序集中的resx文件中使用键来查找资源值(或者可能我不知道) 最快的代码是什么,我可以使用嵌入为程序集中资源的资源文件中的键来检索字符串值或值。我正在资源文件中存储异常的友好消息,并希望在需要时使用它们 是否存在用于此目的的静态类 是否有成熟的开源项目可供我使用?您可以使用ResourceManager从程序集中获取字符串值 Assembly assembly = this.GetType().Assembly; ResourceManager re

我真的不知道/不知道答案,知道如何使用c#在程序集中的
resx
文件中使用键来查找资源值(或者可能我不知道)

最快的代码是什么,我可以使用嵌入为程序集中资源的资源文件中的键来检索
字符串值
。我正在资源文件中存储异常的友好消息,并希望在需要时使用它们

是否存在用于此目的的静态类


是否有成熟的开源项目可供我使用?

您可以使用ResourceManager从程序集中获取字符串值

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


如果资源与代码位于同一程序集中,则执行以下操作:

String resourceValue = MyAssemblyNameSpace.Properties.Resources.ResourceName

摘自。

当我为C类型的单元测试类库创建一个名为UnitTests的新项目时,我右键单击并添加了一个新资源。我把它命名为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);
        }
    }
}
[global::System.CodeDom.Compiler.GeneratedCodeAttribute(“System.Resources.Tools.StronglyTypedResourceBuilder”,“4.0.0.0”)]
[全局::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[全局::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
内部类UnitTestsResources{
//一些自动生成的代码
/// 
///查找类似于测试所需OPOS设备的本地化字符串。
/// 
内部静态字符串设备要求{
得到{
返回ResourceManager.GetString(“DeviceRequestSG”,resourceCulture);
}
}
/// 
///查找类似OPOS设备的本地化字符串,不得安装该设备进行测试。
/// 
内部静态字符串NoDeviceRequireMsg{
得到{
返回ResourceManager.GetString(“NoDeviceRequireMsg”,resourceCulture);
}
}
}

因为它只用于我的单元测试,所以我对此很满意。希望它能帮助其他人。

为了改进Herzube的答案,我将展示我是如何实现的

不要为资源文件创建项目或文件夹,只需右键单击项目并执行“添加->新建项”,然后选择“资源文件”。打开资源文件stick in your string,另存为一个有用的名称,然后导航到要使用它们的C#,然后就是:

String resourceValue=MyProjectName.MyResourceFileName.MyResourceRowItem

如果这不起作用,请注意resx文件中的“访问修饰符”下拉列表

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

给定
“资源\u名称”
您可以检索资源值。

您好,谢谢您的代码。lin1不使用反射吗?“这能有多好的表现呢?”Deeptechtons,是的,差不多。实际上,我并不认为GetType().Assembly有那么慢,但即使如此,您也应该在程序的早期做一次。你可以把
resourceManager
藏在应用程序的主对象或其他东西的某个地方,在需要获取字符串时使用它。程序集是否在生命周期的早期提供事件,因此,在异常发生时,我只需检索字符串,而不是每次实例化。给我一个
MissingManifestResourceException
。哪种方法更快,超过一个或“MyAssemblyNameSpace.Properties.Resources.ResourceName”。第一种方式是在每次我们需要时从resc文件按需加载,第二种方式是只在开始时加载吗?这是一种更简单的方式,就像使用resourceManager一样。谢谢。这样做的好处是不用魔法弦。此外,如果在代码中添加“using MyAssemblyNameSpace.Properties;”,您将能够简单地在代码中编写Resources.ResourceName。这是否适用于本地化?i、 e.当我有Resources.de.resx和Resources.en.resx以及各自的本地化字符串时,我是否需要ResourceManager?这就是我要找的!我总是尽量避免使用其他ResourceManager构造函数使用的字符串。最佳答案。它不仅避免硬编码字符串,而且还使用文化信息来支持多语言
 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);
 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);