2009-07-08 4 views
9

In meiner C# -Anwendung muss ich eine RESX-Datei mit Zeichenfolgen erstellen, die für jeden Kunden angepasst ist.Lesen einer Zeichenfolge, die in einer Ressourcendatei (resx) mit dynamischem Dateiname gespeichert ist

Was ich tun möchte, ist zu vermeiden, das gesamte Projekt neu kompilieren jedes Mal, wenn ich meine Anwendung für meinen Kunden bereitstellen muss, so muss ich dynamischen Zugriff auf diese Zeichenfolge. Also, wie kann ich (während der App-Ausführung) auf eine resx-Datei zugreifen, wenn ich den Dateinamen nur zur Ausführungszeit kwow?

Da jetzt schreibe ich etwas ähnliches:

Properties.Resources.MyString1 

wo Ressource meine Resource.resx Datei. Aber ich brauche etwas wie folgt aus:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1"); 

Ist es möglich?

Dank Mark

+0

Ok Prashanth es wors! Die einzige Sache ist, dass "Func" -Methode nicht "statisch" sein kann, andernfalls Compiler eine Ausnahme werfen. Danke an alle ... –

Antwort

12

Wird so etwas in Ihrem Fall helfen?

Dictionary<string, string> resourceMap = new Dictionary<string, string>(); 

public static void Func(string fileName) 
{ 
    ResXResourceReader rsxr = new ResXResourceReader(fileName);   
    foreach (DictionaryEntry d in rsxr) 
    { 
     resourceMap.Add(d.Key.ToString(),d.Value.ToString());   
    }   
    rsxr.Close(); 
} 

public string GetResource(string resourceId) 
{ 
    return resourceMap[resourceId]; 
} 
+4

Es ist besser, ResXResourceReader in ** using ** Anweisung zu verpacken, anstatt den Leser explizit zu schließen . – arbiter

+0

sehr schöner Code. –

+0

Ich denke, dass ich zufällig über den Code hier (Durchlauf 2): http://www.c-sharpcorner.com/UploadFile/yougerthen/105262008135822PM/1.aspx –

1

Natürlich ist es möglich. Sie müssen über ResouceSet Klasse in msdn lesen. Und wenn Sie .resx Dateien direkt laden möchten, können Sie ResxResourceSet verwenden.

2

Sie konnten die benötigten Ressourcen in eine separate DLL (eine für jeden Kunden) setzen, extrahieren dann die Ressourcen dynamisch Reflexion mit:

Assembly ass = Assembly.LoadFromFile("customer1.dll"); 
string s = ass.GetManifestResource("string1"); 

Ich kann die Syntax falsch - es ist zu früh. Eine mögliche Einschränkung ist hier: Der Zugriff auf eine DLL über Reflection sperrt die DLL-Datei für eine gewisse Zeit, wodurch Sie möglicherweise die DLL auf dem Client-Rechner nicht aktualisieren oder ersetzen können.

+5

+1 für diesen Variablennamen. –

0

Verwenden Sie LINQ to SQL anstelle der System.Windows.Forms.ResXResourceReader Klasse in Ihrem Projekt zu referenzieren.

public string GetStringFromDynamicResourceFile(string resxFileName, string resource) 
{ 
    return XDocument 
       .Load(resxFileName) 
       .Descendants() 
       .FirstOrDefault(_ => _.Attributes().Any(a => a.Value == resource))? 
       .Value; 
} 

Und es verwenden:

GetStringFromDynamicResourceFile("MyFile.resx", "MyString1");