Können Sie erläutern, ob die RESX-Datei projektintern ist oder ob Sie eine separate RESX-Datei oder RESX aus einer anderen Assembly lesen möchten (oder müssen)?
Abel
Antworten:
242
Sie sollten immer den Ressourcenmanager verwenden und Dateien nicht direkt lesen, um sicherzustellen, dass die Globalisierung berücksichtigt wird.
using System.Collections;
using System.Globalization;
using System.Resources;
...
/* Reference to your resources class -- may be named differently in your case */ResourceManagerMyResourceClass=newResourceManager(typeof(Resources));ResourceSet resourceSet =MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture,true,true);foreach(DictionaryEntry entry in resourceSet){string resourceKey = entry.Key.ToString();object resource = entry.Value;}
Ich habe ein wenig gebraucht, um herauszufinden, dass Sie diese Zeile benötigen, um MyResourceClass zu deklarieren. ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
JoeFletch
6
@ JoeFletch: Diese Zeile wird nicht benötigt. Der Code ruft die Ressourcendatei direkt auf. Beispiel: Ich habe eine Datei mit dem Namen PageList.resx, dann rufe ich auf: ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet (CultureInfo.CurrentUICulture, true, true);
Gabriel
@ Gabriel, danke für das Update! Ich muss zu meinem Code zurückkehren, um dies zu überprüfen.
JoeFletch
3
JoeFletchs Linie hat mir tatsächlich geholfen. Ich hatte ein Resx in einem anderen C # -Projekt, daher erlaubte mir seine Zeile, diese DLL-Assembly aufzurufen und die Ressourcen auf diese Weise zu laden. Als ich versuchte, die PageList in meinen Code aufzunehmen, wurde ein Fehler für PageList.ResourceManager ausgegeben. "PageList enthält keine Definition für ResourceManager". Und schließlich hat der String resourceKey = entry.Key einen Fehler ausgelöst. Stattdessen habe ich "object resourceKey = entry.Key" verwendet
sksallaj
2
Je nachdem, ob in Ihrer Ressource tatsächlich Kulturen definiert sind, müssen Sie zu CultureInfo.InvariantCulture wechseln. Hier habe ich Ressourcen in einer Bibliothek verwendet, keine WinForms-App.
Israel Lopez
26
Blogge darüber in meinem Blog :) Kurzversion ist, um die vollständigen Namen der Ressourcen zu finden (es sei denn, Sie kennen sie bereits):
var assembly =Assembly.GetExecutingAssembly();foreach(var resourceName in assembly.GetManifestResourceNames())System.Console.WriteLine(resourceName);
Um sie alle für etwas zu verwenden:
foreach(var resourceName in assembly.GetManifestResourceNames()){
using(var stream = assembly.GetManifestResourceStream(resourceName)){// Do something with stream}}
Um Ressourcen in anderen Assemblys als der ausführenden zu verwenden, erhalten Sie lediglich ein anderes Assemblyobjekt, indem Sie einige der anderen statischen Methoden der AssemblyKlasse verwenden. Ich hoffe es hilft :)
Können Sie Ressourcen auflisten, die sich nicht in einem Ordner namens "Ressource" befinden? Ich möchte alle in meinem Projekt befindlichen Ressourcenbilder in einem Ordner namens "Bilder" auflisten.
Simon Bosley
Ziemlich sicher, dass es egal ist, wo es sich befindet? Probier es aus?
Svish
1
Ich hatte Dateien in einem Ordner zum Importieren von SQL-Dateien und dies funktionierte perfekt. Ich habe eine Konvertierung von einem Stream in einen String hinzugefügt, damit ich die Datei lesen konnte und keine Probleme hatte.
ResXResourceReader rsxr =newResXResourceReader("your resource file path");// Iterate through the resources and display the contents to the console.foreach(DictionaryEntry d in rsxr){Console.WriteLine(d.Key.ToString()+":\t"+ d.Value.ToString());}
// Create a ResXResourceReader for the file items.resx.ResXResourceReader rsxr =newResXResourceReader("items.resx");// Create an IDictionaryEnumerator to iterate through the resources.IDictionaryEnumerator id = rsxr.GetEnumerator();// Iterate through the resources and display the contents to the console.foreach(DictionaryEntry d in rsxr){Console.WriteLine(d.Key.ToString()+":\t"+ d.Value.ToString());}//Close the reader.
rsxr.Close();
Beachten Sie, dass diese Klasse in der System.Windows.FormsAssembly enthalten ist und nicht automatisch hinzugefügt wird, wenn Sie eine MVC-App verwenden
Rob Scott
6
Sobald Sie Ihrem Projekt eine .RESX-Ressourcendatei hinzufügen, erstellt Visual Studio eine Designer.cs mit demselben Namen und erstellt eine Klasse für Sie mit allen Elementen der Ressource als statischen Eigenschaften. Sie können alle Namen der Ressource sehen, wenn Sie den Punkt im Editor eingeben, nachdem Sie den Namen der Ressourcendatei eingegeben haben.
Alternativ können Sie Reflexion verwenden, um diese Namen zu durchlaufen.
Type resourceType =Type.GetType("AssemblyName.Resource1");PropertyInfo[] resourceProps = resourceType.GetProperties(BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.GetProperty);foreach(PropertyInfo info in resourceProps){string name = info.Name;objectvalue= info.GetValue(null,null);// object can be an image, a string whatever// do something with name and value}
Diese Methode kann natürlich nur verwendet werden, wenn sich die RESX-Datei im Bereich der aktuellen Assembly oder des aktuellen Projekts befindet. Verwenden Sie andernfalls die von "puls" bereitgestellte Methode.
Der Vorteil dieser Methode besteht darin, dass Sie die tatsächlichen Eigenschaften aufrufen, die für Sie bereitgestellt wurden, und gegebenenfalls die Lokalisierung berücksichtigen. Es ist jedoch ziemlich redundant, da Sie normalerweise die typsichere direkte Methode zum Aufrufen der Eigenschaften Ihrer Ressourcen verwenden sollten.
Warum Reflection verwenden, wenn ein ResourceSet verfügbar ist?
Oundless
Das würde ich mich auch fragen (siehe letzten Absatz). Ich wollte nur eine alternative Methode zeigen, aber was noch wichtiger ist, ich wollte zeigen, dass die Klasse vollständig zugänglich ist und Sie keine Magie von Hand ausführen müssen (erster Absatz).
Wenn Sie LINQ verwenden möchten, verwenden Sie resourceSet.OfType<DictionaryEntry>(). Mit LINQ können Sie beispielsweise Ressourcen anhand ihres Index (int) anstelle des Schlüssels (Zeichenfolge) auswählen:
var resx =ResourcesName.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture,false,false);foreach(DictionaryEntry dictionaryEntry in resx){Console.WriteLine("Key: "+ dictionaryEntry.Key);Console.WriteLine("Val: "+ dictionaryEntry.Value);}
Antworten:
Sie sollten immer den Ressourcenmanager verwenden und Dateien nicht direkt lesen, um sicherzustellen, dass die Globalisierung berücksichtigt wird.
...
quelle
ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
Blogge darüber in meinem Blog :) Kurzversion ist, um die vollständigen Namen der Ressourcen zu finden (es sei denn, Sie kennen sie bereits):
Um sie alle für etwas zu verwenden:
Um Ressourcen in anderen Assemblys als der ausführenden zu verwenden, erhalten Sie lediglich ein anderes Assemblyobjekt, indem Sie einige der anderen statischen Methoden der
Assembly
Klasse verwenden. Ich hoffe es hilft :)quelle
Verwenden Sie die ResXResourceReader-Klasse
quelle
Siehe Link: Microsoft-Beispiel
quelle
System.Windows.Forms
Assembly enthalten ist und nicht automatisch hinzugefügt wird, wenn Sie eine MVC-App verwendenSobald Sie Ihrem Projekt eine .RESX-Ressourcendatei hinzufügen, erstellt Visual Studio eine Designer.cs mit demselben Namen und erstellt eine Klasse für Sie mit allen Elementen der Ressource als statischen Eigenschaften. Sie können alle Namen der Ressource sehen, wenn Sie den Punkt im Editor eingeben, nachdem Sie den Namen der Ressourcendatei eingegeben haben.
Alternativ können Sie Reflexion verwenden, um diese Namen zu durchlaufen.
Diese Methode kann natürlich nur verwendet werden, wenn sich die RESX-Datei im Bereich der aktuellen Assembly oder des aktuellen Projekts befindet. Verwenden Sie andernfalls die von "puls" bereitgestellte Methode.
Der Vorteil dieser Methode besteht darin, dass Sie die tatsächlichen Eigenschaften aufrufen, die für Sie bereitgestellt wurden, und gegebenenfalls die Lokalisierung berücksichtigen. Es ist jedoch ziemlich redundant, da Sie normalerweise die typsichere direkte Methode zum Aufrufen der Eigenschaften Ihrer Ressourcen verwenden sollten.
quelle
Sie können ResourceManager.GetResourceSet verwenden .
quelle
Wenn Sie LINQ verwenden möchten, verwenden Sie
resourceSet.OfType<DictionaryEntry>()
. Mit LINQ können Sie beispielsweise Ressourcen anhand ihres Index (int) anstelle des Schlüssels (Zeichenfolge) auswählen:quelle
Mit dem Nuget-Paket
System.Resources.ResourceManager
(v4.3.0) wird dasResourceSet
undResourceManager.GetResourceSet
nicht verfügbar.Verwenden von
ResourceReader
, wie in diesem Beitrag vorgeschlagen: " C # - Es kann keine Zeichenfolge von ResourceManager (von der Satellitenassembly) abgerufen werden. "Es ist weiterhin möglich, den Schlüssel / die Werte der Ressourcendatei zu lesen.
quelle
Verwenden von LINQ to SQL :
quelle
Einfache Leseschleife verwenden diesen Code
quelle