ΝΕΤ Compiler - DEBUG εναντίον ΑΠΟΔΕΣΜΕΥΣΗ




Για χρόνια έχω με τη σταθερή DEBUG compiler σε VB.NET να γράψει μηνύματα στην κονσόλα. Έχω, επίσης, χρησιμοποιώντας System.Diagnostics.Debug.Write με παρόμοιο τρόπο. Ήταν πάντα κατανόησή μου είναι ότι όταν ΤΥΠΟΥ χρησιμοποιήθηκε ως επιλογή κατασκευής, ότι όλες αυτές οι καταστάσεις έχουν μείνει έξω από τον compiler, ελευθερώνοντας τον κωδικό σας παραγωγής της εναέριας των δηλώσεων εντοπισμού σφαλμάτων. Πρόσφατα, όταν ασχολούνται με το Silverlight 2 Beta 2, παρατήρησα ότι το Visual Studio στην πραγματικότητα συνδέεται με ένα μεταγλώττισης που έτρεχε μακριά από μια δημόσια ιστοσελίδα και εμφανίζεται δηλώσεις DEBUG που υπέθεσα δεν είχαν ακόμα συνταχθεί! Τώρα, πρώτη κλίση μου είναι να υποθέσουμε ότι κάτι δεν πάει καλά με το περιβάλλον μου, αλλά θέλω επίσης να ζητήσει κανείς με βαθιά γνώση σχετικά με System.Diagnostics.Debug και την επιλογή κατασκευή εντοπισμού σφαλμάτων σε γενικές γραμμές αυτό που μπορεί να παρανόηση εδώ.
Η προτιμώμενη μέθοδος είναι να χρησιμοποιήσετε πραγματικά την ιδιότητα υπό όρους για να τυλίξει τις κλήσεις εντοπισμού σφαλμάτων σας, μην χρησιμοποιήσετε τις οδηγίες μεταγλωττιστή. #ifs μπορεί να πάρει δύσκολες και μπορεί να οδηγήσει σε περίεργα προβλήματα κατασκευής.


Ένα παράδειγμα της χρήσης ενός υπό όρους χαρακτηριστικό είναι η εξής (σε C #, αλλά λειτουργεί σε VB.NET πολύ):



```
[ Conditional("Debug") ]
private void WriteDebug(string debugString)
{
  // do stuff
}

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write ().
Από μερικές από την αρχική έρευνα δεν φαίνεται να είναι μια εξαιρετικά απλή λύση. 


Φαίνεται ότι το να κάνουμε αυτό συνεπάγεται με το Visual Studio 2008, στην πραγματικότητα εγκατεστημένο στο διακομιστή συνεχούς ολοκλήρωσης, η οποία θα μπορούσε να είναι ένας διακόπτης διαπραγμάτευσης.


Στη συνέχεια, να ρυθμίσετε το MSTest.exe να τρέξει στη λίστα εργασιών, αλλά πρώτα θα πρέπει να κάνει ένα αρχείο δέσμης για να διαγράψετε τα αρχεία αποτελέσματα από προηγούμενες διελεύσεις και την ύπαρξη αυτού του αρχείου προκαλεί ένα σφάλμα.


Στη συνέχεια, δημιουργήστε ένα XSLT για να μορφοποιήσετε τα αποτελέσματα και να το βάλετε στο αρχείο dashboard.config.


Το άρθρο κωδικό έργου που βρήκα έχει πολύ περισσότερες λεπτομέρειες.


[Η ενσωμάτωση Visual 2008 Δοκιμές Μονάδα Studio ομάδας συστήματος με CruiseControl.NET](http://www.codeproject.com/KB/tips/VSTS2008_Tests_With_CCNET.aspx) CVS παρακολουθεί μόνο την τροποποίηση με βάση το αρχείο-από-αρχείο, ενώ SVN παρακολουθεί μια ολόκληρη δεσμευτούν ως νέα αναθεώρηση, πράγμα που σημαίνει ότι είναι ευκολότερο να ακολουθήσετε την ιστορία του έργου σας. Προσθέστε το γεγονός ότι όλα τα σύγχρονα λογισμικά ελέγχου προέλευσης χρησιμοποιούν την έννοια της αναθεώρησης και έτσι είναι πολύ πιο εύκολο να μεταναστεύσουν από το SVN ό, τι είναι από το CVS.


Υπάρχει επίσης η ατομική commit πρόβλημα. Αν και συνάντησε μόνο μία φορά, είναι πιθανό ότι 2 άτομα διαπράττουν από κοινού σε CVS μπορεί να έρχονται σε σύγκρουση μεταξύ τους, χάνοντας κάποια δεδομένα και τη θέση του πελάτη σας σε ασυνεπή κατάσταση. Όταν ανιχνεύεται νωρίς, τα προβλήματα αυτά δεν είναι σημαντικά, διότι τα δεδομένα σας είναι ακόμα κάπου εκεί έξω, αλλά μπορεί να είναι ένας πόνος σε ένα αγχωτικό περιβάλλον.


Και τέλος, δεν είναι πολλά εργαλεία που έχουν αναπτυχθεί γύρω από το CVS πια. Ενώ τα νέα και λαμπερά νέα εργαλεία, όπως το Git ή Mercurial δεν έχουν σίγουρα τα εργαλεία ακόμα, SVN έχει μια αρκετά μεγάλη βάση εφαρμογής σε οποιοδήποτε σύστημα.


**EDIT 2015** : Σοβαρά, αυτή η απάντηση είναι 7 χρονών τώρα. Ξεχάστε SVN, πηγαίνετε χρήση Git όπως όλοι οι άλλοι! Υπάρχουν κάποιες «αμυχές» που περιλαμβάνουν τη χρήση ενός System.Core.dll από το Framework 3.5 για να τρέξει με .net 2.0, αλλά προσωπικά δεν θα ήθελα να χρησιμοποιήσετε ένα τέτοιο κάπως σαθρά θεμέλια.


Δείτε εδώ: [LINQ υποστήριξη για .NET 2.0](http://weblogs.asp.net/fmarguerie/archive/2007/09/05/linq-support-on-net-2-0.aspx)



> 
> 1. Δημιουργήστε μια νέα εφαρμογή κονσόλας
> 2. Κρατήστε μόνο συστήματος και System.Core όπως αναφέρεται συνελεύσεις
> 3. Ρύθμιση αντιγραφής Τοπική να ισχύει και για System.Core, επειδή δεν υπάρχει στο .NET 2.0
> 4. Χρησιμοποιήστε ένα ερώτημα LINQ στην Κύρια μέθοδο. Για παράδειγμα, η μία κάτω.
> 5. Χτίζω
> 6. Αντιγράψτε το σύνολο της παραγωγής κάδο σε μια μηχανή όπου μόνο είναι εγκατεστημένο το .NET 2.0
> 7. Τρέξιμο
> 
> 
> 


(Απαιτεί .net 2.0 SP1 και δεν έχω ιδέα αν ομαδοποίηση του System.Core.dll παραβιάζει την EULA) Επιστροφή με .Net 1.1 συσκότιση ήταν απαραίτητη: Κωδικός μεταγλώττιση ήταν εύκολο, και θα μπορούσε να πάει από το συγκρότημα, με την IL, με C # κώδικα και έχουν συνταχθεί και πάλι με πολύ λίγη προσπάθεια.


Τώρα με .Net 3.5 δεν είμαι καθόλου σίγουρος. Δοκιμάστε μεταγλώττιση ένα συγκρότημα 3.5? αυτό που παίρνετε είναι μια μακρά μακριά από τη σύνταξη.


Προσθέστε τις βελτιστοποιήσεις από 3,5 (πολύ καλύτερα από 1,1) και τον τρόπο ανώνυμο τύπων, αντιπροσώπους και ούτω καθεξής αντιμετωπίζονται με αντανάκλαση (που είναι ένας εφιάλτης να ξαναμεταγλωττίσετε). Προσθέστε λάμδα εκφράσεις, compiler «μαγεία», όπως Linq-σύνταξη και `var`, και C # 2 λειτουργίες, όπως `yield`(η οποία οδηγεί σε νέες κατηγορίες με δυσανάγνωστο όνομα). Decompiled κωδικό σας καταλήγει σε μεγάλο μακριά από μεταγλωττιστεί.


Μια επαγγελματική ομάδα με τα μέρη του χρόνου θα μπορούσε ακόμα να αναστρέψει τη λειτουργία πίσω και πάλι, αλλά στη συνέχεια το ίδιο ισχύει και για κάθε καλυμμένος κώδικα. Τι κωδικό πήραν από ότι θα ήταν αδύνατο να συντηρηθεί και πολύ πιθανό να είναι πολύ προβληματικό.


Θα ήθελα να συστήσω-κλειδιά υπογραφή συνελεύσεις σας (που σημαίνει ότι αν οι χάκερ μπορούν να μεταγλωττίσετε ένα που πρέπει να ξαναμεταγλωττίσετε όλα), αλλά δεν νομίζω ότι συσκότιση της αξίζει τον κόπο. Όχι, αυτό που κάνετε είναι μια χαρά. Μην αφήσετε αυτούς τους ανθρώπους να σας μπερδέψει.


Εάν έχετε γράψει τις διαδικτυακές υπηρεσίες με .net, στη συνέχεια, τα πληρεξούσια αναφοράς που παράγεται από .net πρόκειται να είναι αρκετά κατάλληλο. Η κατάσταση που περιγράφει (όπου θα είναι και παραγωγός και καταναλωτής) είναι η ιδανική κατάσταση.


Αν χρειαστεί να συνδεθείτε σε υπηρεσίες web που είναι *άγνωστο* κατά τη μεταγλώττιση, τότε θα θέλετε μια πιο δυναμική προσέγγιση, όπου μπορείτε να συναγάγει το «σχήμα» της υπηρεσίας web.


Αλλά ξεκινήστε με τη χρήση της αυτόματης δημιουργείται τάξη μεσολάβησης, και μην ανησυχείτε γι 'αυτό μέχρι να χτυπήσει έναν περιορισμό. Και όταν το κάνεις - επανέλθω σε στοίβα υπερχείλιση ;-) Μετά από κάποια έρευνα, έχω βρεθεί επιτέλους μια λύση στο πρόβλημα.


Έχω αντικαταστήσει τις κλήσεις προς Context.RewritePath () μέθοδος με το νέο (εισήχθη το ASP.NET 3.5) **Context.Server.TransferRequest ()** μέθοδο.


Είναι προφανές πλέον, όχι όμως περίπτωση Ανώτερος Dev Μηχανικός στο IIS πυρήνα της ομάδας σκέψη ότι.


Έχω δοκιμάσει για συνεδρία, ταυτότητας, postback, querystring, ... θέματα και βρήκε κανένα.


Αύριο θα αναπτύξετε την αλλαγή σε μια πολύ hight ιστοσελίδα της κυκλοφορίας, και θα ξέρουμε σύντομα πώς λειτουργεί στην πραγματικότητα. :)


Θα είμαι πίσω με την ενημέρωση.


**Η ενημέρωση:** η λύση δεν είναι ακόμα απόλυτα σε διακομιστές παραγωγής μου, αλλά αυτό είναι δοκιμασμένο και κάνει δουλειά και στο βαθμό που μπορώ να πω τώρα, είναι μια λύση για το πρόβλημά μου. Αν έχω ανακαλύψει οτιδήποτε άλλο στην παραγωγή, θα δημοσιεύσετε μια ενημέρωση.


**Η τελευταία ενημέρωση:** Έχω αυτή τη λύση στην παραγωγή για πάνω από ένα χρόνο και έχει αποδειχθεί ότι είναι μια καλή και σταθερή λύση χωρίς προβλήματα. Θα ήθελα να μείνω μακριά από αυτό. Είναι ένα πολύ κακό παράδειγμα. Δεν καταλαβαίνω γιατί η Microsoft έθεσε στο διαδίκτυο. Πρώτα απ 'όλα για τους λόγους ασφαλείας, αλλά ο κώδικας είναι πολύ δύσκολο να διαβάσει για τους νέους σχεδιαστές. Χρησιμοποιώ asp.net MVC από την προεπισκόπηση 2, αλλά είναι ακόμα πολύ δύσκολο να διαβάσει αυτόν τον κωδικό, γιατί είναι κακό. Πολλές καλύτερα παραδείγματα που βρέθηκαν ή που χρησιμοποιούνται εδώ στοίβα υπερχείλιση. Προσωπικά προτείνω να παρακολουθείτε τα screencasts στην ιστοσελίδα Rob Connery ή για [Autumnofagile](http://www.autumnofagile.net)


[Karl Seguin πήρε το χρόνο για να συνοψίσουμε](http://codebetter.com/blogs/karlseguin/archive/2008/12/15/oxite-oh-dear-lord-why.aspx)


[Rob Κόνερι εργάζεται για τη Microsoft και δεν του αρέσει, είτε](http://blog.wekeroad.com/blog/some-thoughts-on-oxite/)


[Μια νέα λέξη είναι το όνομά του, αφού: Oxitis](http://frickinsweet.com/ryanlanciaux.com/post/Do-you-have-this-condition.aspx) Υπάρχει μια μεγάλη διαφορά. LINQ-to-SQL ερωτημάτων επιλογής μπορεί να είναι μεγάλες σύνθετες εκφράσεις δέντρα. Της αυτά που μπορεί να λάβει κάποια «σύνταξη». Στην περίπτωση αυτή συνενώνονται σε κάποιο T-SQL που μπορεί να τρέξει εναντίον του SQL Server. Έτσι είναι λογικό να αποθηκεύουν προσωρινά το αποτέλεσμα μιας πράξης, έτσι ώστε να μπορεί να επαναχρησιμοποιηθεί.


Ωστόσο άλλες Διαγραφή, ενημέρωση, και Εισαγωγή είναι απλές λειτουργίες που δεν απαιτούν ένα δέντρο έκφραση για να μετατραπεί σε T-SQL (το ίδιο LINQ είναι όλα σχετικά με την αναζήτηση). Του ακριβώς ατυχές το γεγονός ότι έχουμε εκπαιδευτεί να σκέφτονται SQL κώδικα που εκτελεί αυτές τις άλλες λειτουργίες ως «ερωτήματα», δεν είμαστε actuall ζητούν οποιαδήποτε πληροφορία.


Οι πράξεις αυτές ορίζονται μόνο από την DataContext όχι από LINQ ως εκ τούτου, τον κωδικό για να εκτελέσετε αυτές τις λειτουργίες είναι ήδη συνταχθεί. Έχω γράψει μερικά κομμάτια άποψη για LINQ-to-οντότητες, και τη σχέση της με LINQ-to-SQL:


<http://www.hackification.com/2008/12/03/linq-to-entities-the-blackberry-storm-of-orms/>
[http://www.hackification.com/2008/12/04/linq- to-φορείς-παρακολούθησης /](http://www.hackification.com/2008/12/04/linq-to-entities-follow-up/)


Περίληψη: LINQ-to-SQL δεν είναι το ίδιο με το LINQ-to-οντότητες. L2S έχει ένα μικρό χαρακτηριστικό γνώρισμα-σύνολο, αλλά τι κάνει, το κάνει πολύ καλά. L2E έχει ως στόχο να καλύψει μια πολύ ευρύτερη χαρακτηριστικό-set, αλλά η τρέχουσα έκδοση φαίνεται να έχει κάποια κραυγαλέα κενά (π.χ. τεμπέληδες φόρτωση). v2 της L2E θα πρέπει να είναι πολύ καλύτερα? η τρέχουσα έκδοση (IMHO) μοιάζει περισσότερο με μια βήτα. Δεν είμαι σίγουρος αν αυτό βοηθάει (βρήκα την τεκμηρίωση ccnet κάπως άχρηστη κατά καιρούς):


[Χρησιμοποιώντας CruiseControl.NET με MSTest](http://confluence.public.thoughtworks.org/display/CCNET/Using+CruiseControl.NET+with+MSTest)