2009-09-21 18 views
12

Tengo el problema de que necesito distribuir un proyecto C# como un único archivo EXE que no es un instalador sino el programa real. También debe incluir una traducción que actualmente reside en un subdirectorio.Cómo incrustar un conjunto satélite en el archivo EXE

¿Es posible incrustarlo directamente en el binario?

Respuesta

10

La respuesta corta es sí, hay un programa llamado Assembly Linker (AL.exe) que incrustará los ensamblajes de esta manera. Su caso de uso principal es la localización, suena así también para lo que lo necesita. Si es así, debería ser sencillo.

Ej:

al/t: /embed:strings.de.resources lib/cultura: de /out:MyApp.resources.dll

o

al.exe/culture: es-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources/plantilla: bin \ Debug \ HelloWorld.exe

This es un tutorial de ejemplo de MSDN con los ejemplos anteriores y más. También es posible que desee leer this blog post, que explica su uso un poco más.

+0

El enlace a la entrada del blog se rompe . –

+2

Por lo que puedo decir, al.exe se puede usar para crear ensamblajes satelitales, pero no creo que pueda unir múltiples recursos de cultura en un solo ensamblaje, que es lo que la pregunta requiere. –

3

Otra opción es incrustar los otros ensamblajes como EmbededResource. Luego maneje los dominios de aplicación AssemblyResolve, desde aquí puede leer el ensamblaje del recurso y cargarlo en el tiempo de ejecución. Algo así como lo siguiente:

public class HookResolver 
{ 
    Dictionary<string, Assembly> _loaded; 

    public HookResolver() 
    { 
     _loaded = new Dictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase); 
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    } 

    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     string name = args.Name.Split(',')[0]; 
     Assembly asm; 
     lock (_loaded) 
     { 
      if (!_loaded.TryGetValue(name, out asm)) 
      { 
       using (Stream io = this.GetType().Assembly.GetManifestResourceStream(name)) 
       { 
        byte[] bytes = new BinaryReader(io).ReadBytes((int)io.Length); 
        asm = Assembly.Load(bytes); 
        _loaded.Add(name, asm); 
       } 
      } 
     } 
     return asm; 
    } 
} 
3

ILMerge creará un único archivo EXE para su aplicación. Puede download it de Microsoft. Combina conjuntos juntos y puede internalizarlos para que las clases fusionadas se configuren en interno. Esto es lo que he usado para crear lanzamientos de un único archivo varias veces. Es bastante fácil de integrar en su proceso de construcción.

+6

¿Eso funcionará con las traducciones? – Svish

Cuestiones relacionadas