2009-09-21 8 views
12

J'ai le problème que j'ai besoin de distribuer un projet C# sous la forme d'un seul fichier EXE qui n'est pas un programme d'installation mais le vrai programme. Il doit également inclure une traduction qui réside actuellement dans un sous-répertoire.Comment intégrer un assembly satellite dans le fichier EXE

Est-il possible de l'intégrer directement dans le binaire?

Répondre

10

La réponse courte est oui, il existe un programme appelé Assembly Linker (AL.exe) qui va intégrer les assemblages de cette façon. Son principal cas d'utilisation est la localisation, on dirait que c'est aussi ce dont vous avez besoin. Si oui, cela devrait être simple.

Par exemple:

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

ou

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

This est un exemple de procédure pas à pas de ce MSDN avec les exemples ci-dessus et plus encore. Aussi, vous voudrez peut-être lire this blog post ce qui explique son utilisation un peu plus loin.

+0

Le lien vers le blog est cassé . –

+2

Autant que je sache, al.exe peut être utilisé pour créer des assemblys satellites, mais je ne pense pas qu'il puisse fusionner plusieurs ressources de culture en un seul assemblage, ce que demande la question. –

3

Une autre option consiste à incorporer les autres assemblages en tant que EmbededResource. Puis gérer les domaines de l'application AssemblyResolve, à partir de là, vous pouvez lire l'assembly de la ressource et le charger dans le runtime. Quelque chose comme ce qui suit:

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 va créer un seul fichier exe pour votre application. Vous pouvez download it de Microsoft. Il fusionne les assemblages et peut les internaliser afin que les classes fusionnées soient définies sur interne. C'est ce que j'ai utilisé pour créer des versions de fichiers uniques un certain nombre de fois. Il est assez facile à intégrer dans votre processus de construction.

+6

Cela fonctionnera-t-il avec les traductions? – Svish

Questions connexes