2009-07-08 11 views
9

W mojej aplikacji C# potrzebuję utworzyć plik .resx ciągów dostosowanych dla każdego klienta.Przeczytaj ciąg zapisany w pliku zasobów (resx) z dynamiczną nazwą pliku

Co chcę zrobić, to uniknąć rekompilacji całego projektu za każdym razem, gdy muszę dostarczyć moją aplikację do mojego klienta, więc potrzebuję dynamicznego dostępu do tego ciągu. Jak więc uzyskać dostęp (w trakcie wykonywania aplikacji) do pliku resx, jeśli mam tylko nazwę pliku tylko w czasie wykonywania?

Od teraz piszę coś podobnego:

Properties.Resources.MyString1 

gdzie zasób jest mój plik Resource.resx. Ale muszę coś takiego:

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

jest to możliwe?

Dzięki Mark

+0

Ok Prashanth to wors! Jedyną rzeczą jest, że metoda "Func" nie może być "statyczna" w przeciwnym razie kompilator wyrzuci wyjątek .. Dziękuję wszystkim ... –

Odpowiedz

12

Czy coś takiego w tym przypadku pomoże?

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

Lepiej jest opakować ResXResourceReader w ** przy użyciu instrukcji **, zamiast jawnie zamykającego czytnik . – arbiter

+0

bardzo ładny kod. –

+0

Myślę, że trafiłem w poprzek tego kodu (opis 2): http://www.c-sharpcorner.com/UploadFile/yougerthen/105262008135822PM/1.aspx –

1

Oczywiście jest to możliwe. Musisz przeczytać o klasie ResouceSet w msdn. A jeśli chcesz załadować bezpośrednio pliki .resx, możesz użyć ResxResourceSet.

2

można umieścić niezbędne zasoby do osobnego pliku DLL (po jednym dla każdego klienta), a następnie wyodrębnić zasoby dynamicznie przy użyciu odbicia:

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

mogę mieć niewłaściwej składni - to wcześnie. Jedno potencjalne zastrzeżenie: dostęp do biblioteki DLL za pomocą Reflection zablokuje plik DLL na pewien czas, co może zablokować aktualizację lub zastąpienie biblioteki DLL na komputerze klienta.

+5

+1 dla tej nazwy zmiennej. –

0

Użyj LINQ to SQL zamiast odniesienia do klasy System.Windows.Forms.ResXResourceReader w swoim projekcie.

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

i używać go:

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