369 messaggi dal 08 dicembre 2006
Buonasera a tutti,
di una applicazione in c# che ho fatto, dovrei fare in modo che, una volta in esecuzione ad esempio dal path c:\x, tentando di eseguirla nuovamente da un altro path, ad esempio c:\y, con titolo della form principale diverso, si avvii una seconda istanza della applicazione.
Sono riuscito a non eseguire due volte la stessa applicazione lanciandola dallo stesso path...
Qualcuno mi illumina per favore?

Grazie

Gianni
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Gianni,
se stai usando l'approccio col Mutex, puoi modificare l'id univoco dell'applicazione in modo che coinvolga (o NON coinvolga) il percorso dell'eseguibile che puoi ottenere da System.Reflection.Assembly.GetExecutingAssembly().Location.
  • Se includi il percorso, riuscirai ad aprire varie istanze dell'applicazione se la avvii da un'altra cartella (o se rinomini l'eseguibile);
  • Se NON includi il percorso, riuscirai ad aprire solo un'istanza indipendentemente dalla cartella in cui si trova.


Ecco l'esempio di un'applicazione Winforms che usa l'approccio del Mutex e che include il percorso nell'id.
static class Program
{
    static Mutex mutex = new Mutex(true, CalcolaId());
    private static string CalcolaId()
    {
        var idConPercorso = "MiaApp" + System.Reflection.Assembly.GetExecutingAssembly().Location.ToLowerInvariant();
        var idInBytes = System.Text.Encoding.UTF8.GetBytes(idConPercorso);
        using (var sha1 = new SHA1Managed())
        {
            //Mi calcolo un hash perché il percorso potrebbe essere troppo lungo
            //o contenere caratteri non validi per l'id di un mutex
            var hash = sha1.ComputeHash(idInBytes);
            //Formatto l'hash come stringa esadecimale
            return BitConverter.ToString(hash);
        }
    }
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            mutex.ReleaseMutex();
        }
        else
        {
            MessageBox.Show("only one instance at a time");
        }
    }
}


ciao,
Moreno
Modificato da BrightSoul il 16 gennaio 2017 09.53 -

Enjoy learning and just keep making
369 messaggi dal 08 dicembre 2006
Ciao Moreno,
si, uso l'approccio con il Mutex.
Come sempre, grazie per le tue prezione info.

Gianni

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.