2009-09-21 5 views
12

Ich habe das Problem, dass ich ein C# -Projekt als einzelne EXE-Datei verteilen muss, die kein Installer sondern das eigentliche Programm ist. Es muss auch eine Übersetzung enthalten, die sich derzeit in einem Unterverzeichnis befindet.So betten Sie eine Satellitenbaugruppe in die EXE-Datei ein

Ist es möglich, es direkt in die Binärdatei einzubetten?

Antwort

10

Die kurze Antwort ist ja, es gibt ein Programm namens Assembly Linker (AL.exe), das Assemblys auf diese Weise einbetten wird. Der Hauptanwendungsfall ist Lokalisierung, klingt so, dass Sie es auch brauchen. Wenn ja, sollte es einfach sein.

ZB:

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

oder

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

This ist ein Beispiel Walkthrough davon MSDN mit den obigen Beispielen und mehr. Vielleicht möchten Sie auch lesen this blog post, die ihre Verwendung ein wenig weiter erklärt.

+0

Der Link zum Blog-Post ist gebrochen . –

+2

Soweit ich das beurteilen kann, kann al.exe verwendet werden, um Satelliten-Assemblies zu erstellen, aber ich denke nicht, dass es mehrere Kulturressourcen in einer einzigen Assembly zusammenführen kann, was die Frage erfordert. –

3

Eine andere Möglichkeit besteht darin, die anderen Assemblies als EmbededResource einzubetten. Behandeln Sie dann die App-Domänen AssemblyResolve, von hier aus können Sie die Assembly von der Ressource lesen und in die Laufzeitumgebung laden. Etwas wie folgt aus:

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 wird eine einzelne EXE-Datei für Ihre Anwendung erstellen. Sie können download it von Microsoft. Es führt Zusammenführungen zusammen und kann sie internalisieren, sodass die zusammengeführten Klassen auf intern festgelegt werden. Dies ist, was ich verwendet habe, um einzelne Dateifreigaben mehrere Male zu erstellen. Es ist ziemlich einfach in Ihren Build-Prozess zu integrieren.

+6

Wird das aber mit Übersetzungen funktionieren? – Svish

Verwandte Themen