2009-07-08 12 views
9

En mi aplicación C#, necesito crear un archivo .resx de cadenas personalizadas para cada cliente.Lea una cadena almacenada en un archivo de recursos (resx) con el nombre de archivo dinámico

Lo que quiero hacer es evitar recompilar todo el proyecto cada vez que tengo que proporcionar mi aplicación a mi cliente, por lo que necesito acceso dinámico a esta cadena. Entonces, ¿cómo puedo acceder (durante la ejecución de la aplicación) a un archivo resx si conozco el nombre del archivo solo en el tiempo de ejecución?

Desde ahora escribo algo similar:

Properties.Resources.MyString1 

donde los recursos es mi archivo Resource.resx. Pero necesito algo como esto:

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

¿Es posible?

Gracias Marcos

+0

Ok Prashanth que wors! Lo único es que el método "Func" no puede ser "estático", de lo contrario el compilador arroja una excepción .. Gracias a todos ... –

Respuesta

12

¿Algo como esto ayuda en su caso?

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 mejor ajustar ResXResourceReader en ** usar ** instrucción, en lugar de cerrar explícitamente el lector . – arbiter

+0

código muy agradable. –

+0

Creo que encontré el código aquí (tutorial 2): ​​http://www.c-sharpcorner.com/UploadFile/yougerthen/105262008135822PM/1.aspx –

2

se puede poner los recursos necesarios en un archivo DLL separada (una para cada cliente), a continuación, extraer los recursos de forma dinámica utilizando Reflexión:

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

que pueda tener el mal de sintaxis - es temprano. Una posible advertencia aquí: el acceso a un archivo DLL a través de Reflection bloqueará el archivo DLL durante un período de tiempo, lo que puede impedirle actualizar o reemplazar el archivo DLL en el equipo del cliente.

+5

+1 para ese nombre de variable. –

0

Use LINQ to SQL en lugar de hacer referencia a la clase System.Windows.Forms.ResXResourceReader en su proyecto.

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

y utilizarla:

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