16 Φεβρουαρίου 2006

Συντονισμός του Server και του client στο ίδιο Version του .Net Framework

Σε πολλές περιπτώσεις χρειάζεται ο Server και ο client της εφαρμογής μας να τρέχουν στο ίδιο Version του .Net Framework.
Μία πολύ κλασσική περίπτωση είναι κατά το Serialization ενός Dataset, σε ένα πολύ συχνό σενάριο που κάποιο WebService κάνει WriteXML σε byte() και το επιστρέφει στον Client.
Αν στη περίπτωση πχ, που ο Server έχει εγκατεστημένη (και default) την έκδοση του .Net Framework 2.0 και ο client την έκδοση 1.1 ή 1.0 τότε όταν ο client κάνει deserialization (ReadXML) το Dataset, παίρνει το ακόλουθο σφάλμα :

System.Runtime.Serialization.SerializationException: Type is not resolved for member System.Data.SerializationFormat, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.

Για να συντονίσουμε την εφαρμογή μας έτσι ώστε ο client και ο server να χρησιμοποιούν το ίδιο version του .Net FrameWork πρέπει να διαμορφώσουμε το Configuration file (Web.Config για τον Server,app.Config για τον client) όπως πιο κάτω (ΠΡΟΣΟΧΗ Case Sensitive):

<configuration>
<startup>
<requiredruntime version="v1.0.3705" imageversion="v1.0.3705">
<supportedruntime version="v1.1.4322">
<supportedruntime version="v2.0.50727">
<supportedruntime version="v1.0.3705">
</startup>
</configuration>

Το χρειάζεται μόνο αν πρόκειται για verions 1.0, διαφορετικά λειτουργεί το κατά τη σειρά που το γράφουμε. ΠΧ στο πιο πάνω παράδειγμα θα προτιμήσει το 1.1 μετά το 2.0 και μετά το 1.0.

Θα μπορούσε να έχει δηλωθεί μόνο ένα version όπως πιο κάτω:

<startup>
<supportedruntime version="v1.1.4322">
</startup>

Εδώ δεν χρειάζεται το requiredRuntime γιατί το version είναι 1.1, ενώ δεν θέλουμε να τρέξει η εφαρμογή σε άλλο Framework εκτός από το 1.1.
Αν δεν υπάρχει εγκατεστημένο τότε κατά την εκκίνηση παίρνουμε σφάλμα που ζητάει την αντίστοιχη έκδοση του .Νet Framework.

Για να δείτε ποιά versions του .Net Framework είναι εγκατεστημένα και default στο σύστημα, μπορείτε να πάτε στα properties του Default Web Site του IIS στο Tab ASP.NΕΤ στο ASP.Net Version.

10 Φεβρουαρίου 2006

Μία Wrapper Class που μαζεύει τα Controls μίας φόρμας ανεξάρτητα από τον Container τους

Σε πολλές περιπτώσεις θέλουμε να πάρουμε τα Controls μίας φόρμας ανεξάρτητα αν αυτά βρίσκονται κατ' ευθείαν επάνω σε αυτή ή σε κάποιον άλλο Container.

Εχω γράψει ένα Wrapper Class που κάνει αυτή τη δουλειά και το δημοσίευσα στο DotNetZone http://www.dotnetzone.gr/cs/forums/9525/ShowPost.aspx#9525

Πως το χρησιμποιούμε

Μέσα στη φόρμα γράφουμε :

Dim AllControls as MyControlsCollection = New MyControlsCollection(me)
Οποτε χρειαστούμε το Controls Collection αναφερόμαστε στο property AllControls.Controls

ή ακόμη καλύτερα

Private _Controls as Collection
Private Readonly Property AllControls() as MyControlsCollection
Get
if
_Controls is nothing then
Dim AllControls as MyControlsCollection = New MyControlsCollection(me)
_Controls = AllControls.Controls

end if
Return
_Controls
End Get
End Property

06 Φεβρουαρίου 2006

Attachments Collection Control

Για να πάρουμε το icon της εφαρμογής που συνεργάζεται με κάποιο αρχείο χρησιμοποιούμε την SHGetFileInfo (http://support.microsoft.com/default.aspx?scid=kb;EN-US;319340)

Με την βοήθεια αυτής της Function κατασκέυασα ένα Control που διαχειρίζεται ένα Collection από Attachments τά οποία μπορούν να εξαχθούν σε byte Array.

Κατεβάστε τον κώδικα από εδώ, αποσυμπιέστε το αρχείο και ανοίξτε το Project TestApp

04 Φεβρουαρίου 2006

Binary Serialization με μεταβλητό αριθμό Members

Πολλές φορές χρειάζεται να κάνουμε Binary Serialization σε κάποιο Object της εφαρμογής και να το αποθηκεύσουμε κάπου στο δίσκο ή σε κάποιο binary πεδίο κάποιου table.
Το πρόβλημα είναι ότι αν το κάνουμε Deserialization ενώ έχει αλλάξει λίγο το Structure του object (ΠΧ προστέθηκε ένα property στο νέο τύπο παίρνουμε exception).

Η λύση σε αυτό το πρόβλημα είναι να φτιάξουμε ένα Custom SurrogateSelector και να το περάσουμε στον Binary Formatter μας.

Κατεβάστε τον κώδικα

Αποσυμπιέστε το αρχείο και ανοίξτε το Project TestApp