2010-04-27 13 views
6

Abbiamo un'applicazione .NET che ha come target .NET 3.5. I nostri client lo eseguono da un'unità condivisa (molto raramente) al fine di avere una posizione centrale nel file di configurazione.Perché non viene generata un'eccezione quando non è presente la versione di .NET framework corretta?

Abbiamo notato che se una workstation accede all'unità condivisa ed esegue il programma, ma non ha installato .NET 3.5, non accade nulla, nessun errore, nessuna eccezione, nessuna voce di registro, semplicemente non si avvia.

  • Perché non c'è alcun messaggio di errore mostrato in finestre dal CLR?

  • C'è qualcosa che posso mettere a all'inizio del codice che avrebbe garantire che un messaggio d'errore viene visualizzato ?

Non è un'opzione per eseguire un programma di installazione che verrebbe controllato per i prerequisiti, poiché lo installiamo solo in una posizione centrale.

Grazie.


Idealmente, non avremmo dovuto avere un wrapper per interrogare per la versione di .NET, sembra che il programma non riesce a lanciare, e le finestre devono essere segnalando questo da qualche parte. Non posso credere che fallirebbe silenziosamente.

risposta

10

provare qualcosa di simile si app.config;

<configuration> 
    <startup> 
     <supportedRuntime version="v3.5" /> 
    </startup> 
</configuration> 

Ho una piccola finestra di dialogo, così;

 
--------------------------- 
moreverfoo.exe - .NET Framework Initialization Error 
--------------------------- 
To run this application, you first must install one of the following 
versions of the .NET Framework: 
    v3.5 
Contact your application publisher for instructions about obtaining the 
appropriate version of the .NET Framework. 
--------------------------- 
OK 
--------------------------- 
+0

Funziona benissimo! –

1

Beh, immagino che sia possibile creare un'app in C++, che verificherà se il .NET richiesto è installato. In caso contrario, visualizza la tua messagebox e, se è installata, l'app eseguirà il programma necessario dall'unità condivisa.

1

Sono presenti voci nei registri eventi quando l'applicazione non viene avviata? È difficile da credere, anche se suppongo non impossibile, che fallirebbe completamente in silenzio. Forse la tua applicazione sta effettivamente generando un'eccezione prima che venga caricato il primo modulo, inghiottendolo silenziosamente (blocco catch vuoto) e poi uscendo, il tutto senza alcun tipo di logging o messaggio di errore.

Inoltre, non è possibile eseguire le applicazioni .NET su una condivisione di rete perché si tratta di una "posizione non sicura" e in passato ho sempre ricevuto un'eccezione di sicurezza.

+0

Sembra che lo ingoia silenziosamente. La condivisione di rete non sembra essere un problema, a seconda del client l'utente verrà avvisato che non è affidabile, ma è ancora in grado di avviarlo. –

+0

Le applicazioni .NET eseguite da condivisioni di rete hanno lo stesso comportamento delle applicazioni native eseguendo con piena attendibilità da .NET 3.5 SP1, vedere http://blogs.msdn.com/brada/archive/2008/08/13/net -framework-3-5-sp1-allow-managed-code-to-be-launch-from-a-network-share.aspx –

0

Anziché pubblicare direttamente l'eseguibile, è possibile creare un file batch che prima controlla se è stata installata la versione corretta di .NET (vedere il collegamento di seguito) e avvia l'app e chiude la finestra della console oppure visualizza un messaggio di errore e pausa.

Is there a command line command for verifying what version of .NET is installed

+0

Questa è una buona idea, immagino che cosa cerco davvero, è il motivo per cui esiste nessun errore da nessuna parte, mi sembra strano che il programma fallirebbe silenziosamente. –

1

Se una macchina ha NET 3.5 SP1 installato (come computer di sviluppo probabilmente lo fa), allora è possibile eseguire un'applicazione .NET da una condivisione di rete, e verrà eseguito normalmente, con piena fiducia. Ma questo è new in 3.5 SP1 - non era nemmeno vero nella versione 3.5 originale. Prima di 3.5 SP1, se si tenta di eseguire un'app da una condivisione di rete, verrà eseguito con autorizzazioni limitate.

Poiché queste macchine non hanno 3.5, è una scommessa sicura che non hanno 3.5 SP1. Quindi la tua app non sarà in grado di fare cose come i file aperti o P/Invoke al codice non gestito. Se ci provi, otterrai delle eccezioni di sicurezza.

  • Cosa succede quando si copia l'EXE sul disco rigido locale su queste macchine e lo si avvia da lì?
  • Cosa succede se l'app ottiene eccezioni di sicurezza all'avvio? Il tuo codice è in grado di mascherare l'eccezione in qualche modo?
+0

+1 Grazie per l'informazione. Non mi ero reso conto che avrei incontrato questi problemi scappando da una condivisione di rete. –

0

Per rispondere specificamente alle vostre domande:

  • No. porsi questa domanda: se il livello richiesto del quadro non è presente, quale versione del CLR dovrebbe essere consentito (o fatti a) per mostrare il messaggio di errore?

  • Anche n. Non c'è alcun bit non gestito di codice/stub che viene eseguito all'inizio della tua app prima di essere gestito, quindi non c'è modo di verificare preventivamente la versione corretta del framework.

Quindi un programma di avvio automatico o involucro è l'unica opzione - o si poteva guardare a portata di click, una volta tipo di applicazione, e vedere se è possibile far valere il presupposto (del quadro destra) utilizzando tale.

Problemi correlati