Κάτσε τώρα γιατί κάπου μπερδεύτηκα. Είναι και η ώρα περίεργη... Εδώ λέει ότι το signature της CreateFile είναι:
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr CreateFile(
string fileName,
[MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
[MarshalAs(UnmanagedType.U4)] FileShare fileShare,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
int flags,
IntPtr template);
Απλά στο .NET 2.0 γίνεται (ίδια πηγή):
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern SafeFileHandle CreateFile(
string fileName,
[MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
[MarshalAs(UnmanagedType.U4)] FileShare fileShare,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] FileAttributes flags,
IntPtr template);
Όπως λέει και στο link της ReadFile:
Tips & Tricks:
NET 2.0 use SafeFileHandle instead of IntPtr
Ποιο ακριβώς είναι το πρόβλημα; Στο .NET 2.0 περνάς σαν παράμετρο το SafeFileHandle, εφόσον το ορίσεις στο signature της ReadFile, αντί του IntPtr. Αυτό καταλαβαίνω από την πηγή που σου έδωσα. Αν υπάρχει κάτι άλλο που δεν το αναφέρουν, τότε... Δοκίμασέ το έτσι και αν δε δουλέψει τότε άλλαξέ το και δοκίμασε με IntPtr.
Στο αρχικό σου post, η CreateFile επέστρεφε IntPtr και εκεί γινόταν όλο το μπλέξιμο. Το ωραίο είναι ότι ο constructor της FileStream είναι overloaded και δέχεται σα παράμετρο το SafeFileHandle object, αλλά όχι στο CF!
Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!