Frage

habe ich das Problem, dass ich brauche ein C # Projekt als eine einzelne EXE-Datei zu verteilen, die kein Installationsprogramm, aber das eigentliche Programm. Es braucht auch eine Übersetzung enthalten, die zur Zeit in einem Unterverzeichnis befindet.

Ist es möglich, sie direkt in die binären einzubetten?

War es hilfreich?

Lösung

Hier ist es die einfachste Lösung, die ich im Internet gesehen:

auch praktisch Umsetzung dieser Lösung: http://code.google.com/p/costura/wiki/HowItWorksEmbedTask

Andere Tipps

Die kurze Antwort ist ja, es ein Programm namens Assembly Linker (AL. exe) die Baugruppen auf diese Weise einbetten. Sein Hauptanwendungsfall ist die Lokalisierung, klingt wie das ist, was Sie es zu brauchen. Wenn ja, sollte es einfach sein.

Beispiel:

  

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

oder

  

Al.exe / Kultur: en-US /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

Diese ist ein Beispiel Marsch durch es MSDN mit den obigen Beispielen und mehr. Auch können Sie diesem Blog-Post was erklärt, seine Verwendung lesen ein bisschen weiter.

Eine andere Möglichkeit ist es, die anderen Baugruppen als EmbededResource einzubetten. Dann behandeln Sie die App-Domains AssemblyResolve, hier von Ihnen die Montage von der Ressource lesen und in die Laufzeit 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;
    }
}

ILMerge wird eine einzelne EXE-Datei erstellen für Ihre Anwendung. Sie können es herunterladen von Microsoft. Es verschmilzt Baugruppen zusammen und kann sie internalisieren, so dass die fusionierte Klassen interne eingestellt sind. Dies ist, was habe ich verwendet, um einzelne Datei Mitteilungen mehrere Male zu erstellen. Es ist ziemlich einfach, in Ihren Build-Prozess zu integrieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top