NET εργαλεία συσκότιση / στρατηγικής




το προϊόν μου έχει πολλές συνιστώσες: ASP.NET, Έντυπα των Windows App και Windows Υπηρεσία. 95% ή έτσι του κώδικα είναι γραμμένο σε VB.NET.


Για λόγους πνευματικής ιδιοκτησίας, θα πρέπει να συσκοτίσετε τον κωδικό, και μέχρι τώρα έχω χρησιμοποιήσει μια έκδοση του dotfuscator που είναι σήμερα άνω των 5 ετών. Σκέφτομαι ότι είναι καιρός να προχωρήσουμε σε ένα νέο εργαλείο γενιάς. Αυτό που ψάχνω είναι ένας κατάλογος των απαιτήσεων που θα πρέπει να λάβετε υπόψη κατά την αναζήτηση για μια νέα συσκοτιστής.


Αυτό που ξέρω ότι θα πρέπει να αναζητήσει μέχρι τώρα:


* ***Σειριοποίησης / De-serialization*** . Στην τρέχουσα λύση μου, απλά πείτε το εργαλείο **δεν** με θολώνω οποιαδήποτε μέλη τα δεδομένα της κατηγορίας, διότι ο πόνος του να μην είναι σε θέση να φορτώσει τα δεδομένα που προηγουμένως σε συνέχειες είναι απλά πάρα πολύ μεγάλη.
* ***Ενσωμάτωση με τη διαδικασία της μεταγλώττισης***
* ***Εργασία με ASP.NET*** . Στο παρελθόν, έχω διαπιστώσει ότι αυτό προβληματική λόγω των μεταβαλλόμενων .dll ονόματα (που συχνά έχουν μία ανά σελίδα) - το οποίο χειρίζεται καλά δεν είναι όλα τα εργαλεία.
Επιστροφή με .Net 1.1 συσκότιση ήταν απαραίτητη: Κωδικός μεταγλώττιση ήταν εύκολο, και θα μπορούσε να πάει από το συγκρότημα, με την IL, με C # κώδικα και έχουν συνταχθεί και πάλι με πολύ λίγη προσπάθεια.


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


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


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


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


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



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

```

Κατά τη μεταγλώττιση, χωρίς το σετ σημαία DEBUG, κάθε κλήση προς WriteDebug θα καταργηθούν όπως υποτίθεται συνέβαινε με Debug.Write (). Συχνά αυτό επιτυγχάνεται με τη χρήση [«Driven δεδομένων Συνδρομές»](https://msdn.microsoft.com/en-us/library/ms169673.aspx) , αλλά αυτή η λειτουργία είναι διαθέσιμη μόνο σε ορισμένες εκδόσεις του SQL: Enterprise και Business Intelligence, αλλά όχι στο πρότυπο.


Έτσι, υπάρχει μια σειρά από δημιουργικές λύσεις. Αλλά δεν μου αρέσει κάποια από αυτές, και απαιτούν ένα δίκαιο κομμάτι της εργασίας έξω από SSRS.


Οι λύσεις που έχω δει περιλαμβάνουν: Δημιουργία της εγγραφής και στη συνέχεια απενεργοποίηση ή επιτρέπουν την εργασία SQL που στέλνει τη συνδρομή (που προσδιορίζονται από GUID.)


Δημιουργήστε ένα .exe .NET περιτύλιγμα για να χειριστεί την αποστολή του email. Μπορεί να εκτελέσετε το ερώτημα πρώτα να δούμε πόσα επέστρεψε σειρές, και στη συνέχεια, αν χρειαστεί, να δημιουργήσει την έκθεση και να συμπεριληφθεί σε ένα email. <p>το .net 4.0 επιτρέπει στα πρωτεύοντα σύνολα interop (ή μάλλον, τα bits που χρειάζεστε) να ενσωματωθούν στη συνέλευση σας, ώστε να μην χρειάζεται να τα αναπτύξετε παράλληλα με την εφαρμογή σας.</p><p>για οποιονδήποτε λόγο, αυτή η συνέλευση δεν μπορεί να ενσωματωθεί - αλλά αυτό ακούγεται σαν να μην είναι πρόβλημα για εσάς. ανοίξτε την καρτέλα ιδιότητες για τη συνέλευση στο visual studio 2010 και ορίστε "ενσωμάτωση τύπων interop" σε "false".</p><p>edit: δείτε επίσης την <a href="https://stackoverflow.com/a/4553402/641833">απάντηση</a> του michael gustus, καταργώντας το επίθημα <code>class</code> από τους τύπους που χρησιμοποιείτε.</p> είχα το ίδιο πρόβλημα με αρχεία zip που κατέβαζα παλιότερα από εκπαιδευτικές ιστοσελίδες. έχω linux mint με διαχειριστή αρχείων τον thunar. έκανα προσθήκη “προσαρμοσμένης ενέργειας” (επεξεργασία –> ρυθμίσεις προσαρμοσμένων ενεργειών –> προσθήκη νέας), ώστε με δεξί κλικ να αποσυμπιέζω με τη σωστή κωδ… <p>είχα το ίδιο πρόβλημα χρησιμοποιώντας asp.net mvc και <a href="http://victorblog.com/2012/12/20/make-angularjs-http-service-behave-like-jquery-ajax/">βρήκα τη λύση εδώ</a> </p><blockquote> <p>υπάρχει μεγάλη σύγχυση μεταξύ των νεοεισερχομένων στο <strong> angularjs </strong> για το γιατί οι <code>$http</code> λειτουργίες στενογραφίας της υπηρεσίας (<code>$http.post()</code>, κλπ.) δεν φαίνονται να είναι εναλλάξιμες με το <strong> ισοδύναμα jquery </strong> (<code>jquery.post()</code>, κ.λπ.)</p> <p>η διαφορά είναι στον τρόπο <strong> jquery </strong> και <strong> angularjs </strong> σειριοποίηση και μετάδοση των δεδομένων. βασικά, το πρόβλημα έγκειται στη γλώσσα του server σας που δεν είναι σε θέση να καταλάβει τη μετάδοση του angularjs με εγγενή ... από προεπιλογή, <strong> jquery </strong> μεταδίδει δεδομένα χρησιμοποιώντας</p> <pre><code>content-type: x-www-form-urlencoded </code></pre> <p>και την εξοικειωμένη σειριοποίηση <code>foo=bar&amp;baz=moe</code>.</p> <p><strong> το angularjs </strong>, ωστόσο, μεταδίδει δεδομένα χρησιμοποιώντας</p> <pre><code>content-type: application/json </code></pre> <p>και <code>{ "foo": "bar", "baz": "moe" }</code></p> <p>η σειριοποίηση json, η οποία, δυστυχώς, μερικές γλώσσες διακομιστή web - <em> και συγκεκριμένα η php </em> - δεν απομακρύνονται εγγενώς.</p> </blockquote><p>δουλεύει άψογα.</p><p><b>κωδικας</b></p><pre><code>// your app's root module... angular.module('mymodule', [], function($httpprovider) { // use x-www-form-urlencoded content-type $httpprovider.defaults.headers.post['content-type'] = 'application/x-www-form-urlencoded;charset=utf-8'; /** * the workhorse; converts an object to x-www-form-urlencoded serialization. * @param {object} obj * @return {string} */ var param = function(obj) { var query = '', name, value, fullsubname, subname, subvalue, innerobj, i; for(name in obj) { value = obj[name]; if(value instanceof array) { for(i=0; i&lt;value.length; ++i) { subvalue = value[i]; fullsubname = name + '[' + i + ']'; innerobj = {}; innerobj[fullsubname] = subvalue; query += param(innerobj) + '&amp;'; } } else if(value instanceof object) { for(subname in value) { subvalue = value[subname]; fullsubname = name + '[' + subname + ']'; innerobj = {}; innerobj[fullsubname] = subvalue; query += param(innerobj) + '&amp;'; } } else if(value !== undefined &amp;&amp; value !== null) query += encodeuricomponent(name) + '=' + encodeuricomponent(value) + '&amp;'; } return query.length ? query.substr(0, query.length - 1) : query; }; // override $http service's default transformrequest $httpprovider.defaults.transformrequest = [function(data) { return angular.isobject(data) &amp;&amp; string(data) !== '[object file]' ? param(data) : data; }]; }); </code></pre> Ενώ μόδας, η λέξη-κλειδί κόλπο αναθεώρηση ενημερώνει μόνο το αρχείο όταν έχει αλλάξει σε αυτή την αναθεώρηση - αν δεν αλλάξει το αρχείο, τότε θα συνεχίσει να αντικατοπτρίζει την παλιά αναθεώρηση.


Αν θέλετε το λογισμικό να αντανακλά πάντα το συνολικό αριθμό αναθεώρησης, τότε θα πρέπει να σκαλίζω το [σχετικό SVN καταχωρήσεις αρχείο](http://svnbook.red-bean.com/en/1.1/ch08s03.html) και αποσυμπιέστε το, το οποίο δεν είναι πάρα πολύ δύσκολο (αυτό είναι ένα αρχείο XML).


Wikipedia το κάνει αυτό στη [σελίδα τους εκδοχή](https://en.wikipedia.org/wiki/Special:Version) για να δείξει την αναθεώρηση του λογισμικού που τρέχει ζωντανά? [ο κώδικας είναι εδώ](https://svn.wikimedia.org/svnroot/mediawiki/trunk/phase3/includes/specials/SpecialVersion.php) - αναζητήστε το **getSvnRevision ()** μέθοδο. καλησπέρα καλώς ήρθες φίλε, τρέξε την εντολή που σου λέει :

sudo dpkg --configure -a

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

κατέβασα τον netsurf τελικώς με πατέντα.

μετά από αυτό που έπαθα πριν με τον brave δε θέλω να ρισκάρω ξανά.

ισως αργότερα αλλά όχι τώρα.

edit: εκεί που εγκαθιστούσα web browsers και αφού έχουν προηγηθεί τα πα… Κάνατε πολύ καλή δουλειά στο να συνοψίσετε τι είναι φοβερό στο Node.js. Η αίσθησή μου είναι ότι το Node.js είναι ιδιαίτερα κατάλληλο για εφαρμογές όπου θα θέλατε να διατηρήσετε μια μόνιμη σύνδεση από το πρόγραμμα περιήγησης πίσω στον διακομιστή. Χρησιμοποιώντας μια τεχνική γνωστή ως ["long-polling"](https://en.wikipedia.org/wiki/Push_technology#Long_polling), μπορείτε να γράψετε μια εφαρμογή που στέλνει ενημερώσεις στον χρήστη σε πραγματικό χρόνο. Η πραγματοποίηση long polling σε πολλούς από τους γίγαντες του διαδικτύου, όπως το [Ruby on Rails](https://en.wikipedia.org/wiki/Ruby_on_Rails) ή το [Django](https://en.wikipedia.org/wiki/Django_%28web_framework%29), θα δημιουργούσε τεράστιο φόρτο στον διακομιστή, επειδή κάθε ενεργός πελάτης τρώει μια διεργασία του διακομιστή. Αυτή η κατάσταση ισοδυναμεί με επίθεση [tarpit](https://en.wikipedia.org/wiki/Tarpit_(networking)). Όταν χρησιμοποιείτε κάτι όπως το Node.js, ο διακομιστής δεν έχει ανάγκη να διατηρεί ξεχωριστά νήματα για κάθε ανοιχτή σύνδεση. 


Αυτό σημαίνει ότι μπορείτε να δημιουργήσετε μια [εφαρμογή συνομιλίας με βάση το πρόγραμμα περιήγησης](https://github.com/rivalslayer/node_chat) σε Node.js που δεν χρειάζεται σχεδόν καθόλου πόρους συστήματος για να εξυπηρετεί πολλούς πελάτες. Κάθε φορά που θέλετε να κάνετε αυτού του είδους τη μακροχρόνια αναζήτηση, το Node.js είναι μια εξαιρετική επιλογή. 


Αξίζει να αναφέρουμε ότι και η Ruby και η Python έχουν εργαλεία για να κάνουν κάτι τέτοιο ([eventmachine](http://rubyeventmachine.com/) και [twisted](https://twistedmatrix.com/trac/), αντίστοιχα), αλλά ότι το Node.js το κάνει εξαιρετικά καλά, και από την αρχή. Η JavaScript είναι εξαιρετικά καλά τοποθετημένη σε ένα μοντέλο ταυτόχρονης λειτουργίας βασισμένο σε callback, και υπερέχει εδώ. Επίσης, η δυνατότητα σειριοποίησης και αποσειριοποίησης με JSON εγγενές τόσο στον πελάτη όσο και στον διακομιστή είναι αρκετά έξυπνη.


Ανυπομονώ να διαβάσω άλλες απαντήσεις εδώ, αυτή είναι μια φανταστική ερώτηση.


Αξίζει να επισημάνουμε ότι το Node.js είναι επίσης εξαιρετικό για καταστάσεις στις οποίες θα επαναχρησιμοποιήσετε πολύ κώδικα σε όλο το χάσμα πελάτη/εξυπηρετητή. Το [Meteor framework](https://meteor.com) το κάνει αυτό πολύ εύκολο, και πολλοί άνθρωποι προτείνουν ότι αυτό μπορεί να είναι το μέλλον της ανάπτυξης ιστοσελίδων. Μπορώ να πω από την εμπειρία μου ότι είναι πολύ διασκεδαστικό να γράφεις κώδικα στο Meteor, και ένα μεγάλο μέρος αυτού είναι να ξοδεύεις λιγότερο χρόνο σκεπτόμενος πώς θα αναδομήσεις τα δεδομένα σου, ώστε ο κώδικας που εκτελείται στο πρόγραμμα περιήγησης να μπορεί εύκολα να τα χειριστεί και να τα μεταβιβάσει πίσω.


Εδώ είναι ένα άρθρο για το Pyramid και το long-polling, το οποίο αποδεικνύεται ότι είναι πολύ εύκολο να ρυθμιστεί με λίγη βοήθεια από το gevent: [*TicTacToe και Long Polling με την Pyramid*](http://michael.merickel.org/2011/6/21/tictactoe-and-long-polling-with-pyramid/). εγκατέστησα την τελευταία έκδοση του προγράμματος και εξακολουθούσα να έχω το ίδιο πρόβλημα. τελικά με τη βοήθεια απο το σχετικό [google group](https://groups.google.com/g/devede-forum/c/2thoie_dsxq) του devedeng, κατάλαβα οτι επιλέγω λάθος encoding type για το αρχείο υποτίτλων που θέλω να βάλω στην ταινία.

όταν επέλεξα το σωστό τύπο encoding για το αρχε…