2012-05-10 10 views
9

Noto Debug.Assert non si attiva nelle app Metro, tuttavia, se il progetto è tradizionale come Console o WinForm, viene attivato. E sì, sono in modalità debug.Debug.Assert (false) non si attiva nelle app Metro win8

È un'impostazione non impostata correttamente in Visual Studio (11 Beta)? O Debug.Assert è destinato a essere disattivato nelle app della metropolitana?

So che molte eccezioni vengono ingerite durante l'esecuzione delle app Metro, ma Debug.Assert è così utile che non riesco a pensare a un motivo per cui dovrebbe essere disabilitato.

risposta

2

E fa grilletto, guarda nella finestra di output. Semplicemente non ti chiede automaticamente di chiedere se vuoi un'interruzione del debugger e quindi continua a guidare.

La proprietà DefaultTraceListener.AssertUIEnabled è false. Questo è un problema di implementazione, non è possibile visualizzare una finestra di messaggio sopra l'interfaccia utente di Metro. Che funziona davvero ma il monitor passa al desktop, piuttosto indesiderabile quando avresti voluto fare clic su No. Difficile da risolvere e senza dubbio sulla lista delle cose da fare. Non è possibile accedere facilmente alla proprietà per impostarla su true, non è accessibile dai metadati. La soluzione alternativa di Filip sembra essere decente.

+0

Forse questo post è stato creato prima della versione corrente di Metro, ma DefaultTraceListener non sembra esistere più per le app Metro. – James

+0

@James - questo è ciò che significa "è inaccessibile dai metadati". E no, non funziona esattamente nello stesso modo in VS2010 RC. Questo è facile da provare per te stesso, per favore fallo prima di inviare una risposta in downvote. –

+0

L'ho provato e DefaultTraceListener.AssertUIEnabled non può essere impostato nel codice perché non esiste. – James

6

Sembra un insetto. Avrei tirato fuori il mio metodo di asserzione. Qualcosa di simile:

[Conditional("DEBUG")] 
public static void Assert(bool condition) 
{ 
    if (!condition) 
     System.Diagnostics.Debugger.Break(); 
} 
+0

Funziona per me :) – kennyzx

0

C'è lo stesso problema con F # in WinRT, in VS2013. L'istruzione assert, che è un alias per System.Diagnostics.Debug.Assert, non genera un'eccezione, quindi a meno che non si stia guardando la finestra Output, le asserzioni possono fallire senza essere notate. Anche se stai guardando, è difficile trovare il punto in cui è stata sollevata l'affermazione.

ho seguito il suggerimento di Filip e ha scritto un breve programma di utilità, come segue:

namespace MyProj.Infrastructure 

module Diagnostics = 

    let Assert condition = if not condition then 
           System.Diagnostics.Debugger.Break() 

ho scelto Debugger.Break sopra sollevando un'eccezione perché si ferma il debugger nel luogo l'asserzione fallisce. Tuttavia, sollevare un'eccezione è un'alternativa accettabile.

Non avevo già progetti o moduli globali adatti nella mia soluzione, quindi ho dovuto crearli proprio per questo, il che era piuttosto fastidioso.

Problemi correlati