L'ultima versione del Connector/NET di MySQL, la 5.1, supporta anche il .NET Compact Framework 2.0. Oggi ho provato ad utilizzarla, quindi ho aggiunto al mio progetto il riferimento alla libreria MySQL.Data.CF.dll e ho tentato di aprire una connessione verso un database remoto... Purtroppo nel momento di eseguire il metodo Open dell'oggetto MySqlConnection viene restituita la seguente eccezione:
System.MissingMethodException: Can't find PInvoke DLL 'kernel32.dll'
Un'occhiata allo Stack trace mostra che il problema risiede nel costruttore della classe MySql.Data.Common.Semaphore. A questo punto ho disassemblato la classe incriminata con Reflector e, così, ho scoperto la causa del problema, ovvero le seguenti dichiarazioni:
[DllImport("kernel32.dll", SetLastError=true)]
private static extern IntPtr CreateSemaphore(ref SECURITY_ATTRIBUTES securityAttributes, int initialCount, int maximumCount, string name);
[DllImport("kernel32.dll")]
private static extern bool ReleaseSemaphore(IntPtr hSemaphore, int lReleaseCount, IntPtr lpPreviousCount);
Che non sono corrette perché la libreria kernel32.dll non fa parte della piattaforma Windows Mobile.
Per farla breve, queste funzioni vengono richiamate quando si utilizza il Connection pooling (che è l'impostazione predefinita). Di consenguenza, in attesa che il codice venga corretto, per utilizzare MySQL da .NET Compact Framework è necessario disabilitare il pooling, specificando il parametro
pooling=false
Nella stringa di connessione che viene passata all'oggetto MySqlConnection.