Domanda

ho avuto il problema che ho bisogno di distribuire un progetto di C # in un unico file EXE che non è un programma di installazione, ma il programma vero e proprio. Ha anche bisogno di includere una traduzione che attualmente risiede in una sottodirectory.

E 'possibile inserire direttamente nel binario?

È stato utile?

Soluzione

Qui è la soluzione più semplice, che ho visto in Internet:

utile anche implementazione di questa soluzione: http://code.google.com/p/costura/wiki/HowItWorksEmbedTask

Altri suggerimenti

La risposta è sì, c'è un programma chiamato Assembly Linker (AL. exe) che incorporerà assiemi in questo modo. Il suo caso d'uso principale è la localizzazione, suona come questo è ciò che serve per troppo. Se così fosse, dovrebbe essere semplice.

Esempio:

  

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

o

  

Al.exe / cultura: it-IT /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

Questa è un esempio di procedura dettagliata esso MSDN con gli esempi riportati in alto e più. Inoltre si consiglia di leggere questo post del blog che spiega il suo utilizzo un po 'più.

Un'altra opzione è quella di incorporare altri gruppi come EmbededResource. Poi gestire l'AssemblyResolve domini app, da qui si può leggere l'assembly dalla risorsa e caricarlo nella fase di esecuzione. Qualcosa di simile a quanto segue:

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 creerà un unico file exe per il vostro applicazione. È possibile scaricarlo da Microsoft. Si fonde assiemi insieme e può internalizzarli modo che le classi unite sono impostati interno. Questo è quello che ho usato per creare versioni singole di file di un certo numero di volte. E 'abbastanza facile da integrare nel vostro processo di generazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top