2011-09-20 20 views
8

Quiero que mi programa sea multilingüe. He logrado que el programa sea multilingüe a través de las propiedades Localizable y Language del Formulario. Hizo algunos archivos .resx. Luego eliminé los archivos no necesarios, como las imágenes (que son las mismas en todos los idiomas), etc. de los archivos .resx.Incrustar recursos de localización .DLL en el ejecutable en C#?

El problema es, por ejemplo, que también genera una carpeta llamada "en" y en esa carpeta, otro archivo generado se llama "ProjectName.resources.dll".

¿Hay alguna forma de incrustar este archivo de recursos en el .exe? Agregarlo a los recursos y configurar Build Action para "Recurso incrustado" tampoco funciona.

Gracias.

+0

http://stackoverflow.com/questions/1453755/how-to-embed-a-satellite-assembly-into-the-exe-file –

+0

Probé ILMerge antes de publicar esto. Probé Assembly Linker pero no pude hacerlo funcionar. csc.exe dio algunos errores debido a las referencias y parece que el ensamblador de engarces hace que el ejecutable no use los recursos dll. – PythEch

+0

No entiendo por qué MS obliga a reinventar la rueda ... – PythEch

Respuesta

5

En .NET Framework 4 puede incrustar la biblioteca de recursos en ejecutable.

http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

Basta con crear misma estructura (con 'lib/es' carpetas localizadas, 'lib/de') e incrustarlos.

private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args) { 
    AssemblyName MissingAssembly = new AssemblyName(args.Name); 
    CultureInfo ci = MissingAssembly.CultureInfo; 

    ... 
    resourceName = "MyApp.lib." + ci.Name.Replace("-","_") + "." + MissingAssembly.Name + ".dll"; 
    var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName) 
    ... 
} 
+0

Cuando agrego las carpetas localizadas con los recursos dll, aparece el error "The nombre de recurso "MyApp.MyApp.resources.dll" no se puede usar más de una vez. Si ahora excluyo mis archivos de resx del proyecto, ya no me aparece este error pero ahora aparece otro error: "TranslatedStrings no es miembro de los recursos". Mis archivos resx se llaman "TranslatedStrings.resx", "TranslatedStrings.it.resx", etc. – JohnRDOrazio

1

Hace un momento que hiciste esta pregunta y ya has aceptado una respuesta, pero aún así intentaré ofrecerte una alternativa. Tuve el mismo problema y así es como lo resolví:

Agregué el dll como un origen a mi C# -Project y agregué este código a mi Main-Method (el que inicia su winform principal).

public static void Main(string[] args) 
{ 
    if (InitdeDEDll()) // Create dll if it's missing. 
    { 
     // Restart the application if the language-package was added 
     Application.Restart(); 
     return; 
    } 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 
    Application.Run(new YOURMAINFORM()); 
} 

private static bool InitdeDEDll() // Initialize the German de-DE DLL 
{ 
    try 
    { 
     // Language of my package. This will be the name of the subfolder. 
     string language = "de-DE"; 
     return TryCreateFileFromRessource(language, @"NAMEOFYOURDLL.dll", 
      NAMESPACEOFYOURRESSOURCE.NAMEOFYOURDLLINRESSOURCEFILE); 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 

private static bool TryCreateFileFromRessource(string subfolder, string fileName, byte[] buffer) 
{ 
    try 
    { 
     // path of the subfolder 
     string subfolderPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + (subfolder != "" ? @"\" : "") + subfolder; 

     // Create subfolder if it doesn't exist 
     if (!Directory.Exists(subfolder)) 
      Directory.CreateDirectory(subfolderPath); 


     fileName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\" + subfolder + (subfolder!=""[email protected]"\":"") + fileName; 
     if (!File.Exists(fileName)) // if the dll doesn't already exist, it has to be created 
     { 
      // Write dll 
      Stream stream = File.Create(fileName); 
      stream.Write(buffer, 0, buffer.GetLength(0)); 
      stream.Close(); 
     } 
     else 
     { 
      return false; 
     } 
    } 
    catch 
    { 
     return false; 
    } 

    return true; 
} 

}

Nota: Esto creará la carpeta y el lenguaje-DLL de nuevo si no se encuentra, por lo que no tiene que preocuparse más que copie esa carpeta y el archivo DLL con su archivo EXE . Si quieres que se desvanezca por completo, este no será el enfoque correcto, por supuesto.

Cuestiones relacionadas