Ormai con C# ed VB.NET sempre più spesso dobbiamo ricorrere alle API contenute nelle dll di sistema per avvalersi di una particolare funzione che nel linguaggio in cui stiamo programmando non è definita, ed qui ci viene in soccorso P/Invoke con DllImport, ma non sempre ci ricordiamo l’interfaccia di quella specifica API, e cosi si parte con la ricerca in rete magari in msdn o altrove, questo però non e produttivo in quanto è tempo che stiamo perdendo, senza contare che perdiamo il filo del lavoro (almeno per me è cosi ).
Per rimediare a tutto questo possiamo adottare in Visual Studio una tecnica che SharpDevelop usa già, ed con grande successo; Sto parlando del famoso programma della red-gate PInvoke.net tuttora già integrato in SharpDevelop ma che esiste anche in forma Add-In per Visual Studio .NET il sito web da dove potete scaricarlo è :
http://www.pinvoke.net/
Oltre al programma il sito offre un gran numero di informazioni sulle API, chiunque può contribuire documentando API non ancora inserite nel già molto fornito database del sito.
Vi assicuro che vale la pena di provarlo, sopratutto per chi le API di windows sono all’ordine del giorno !
Quante volte vi sarebbe servito creare una dll in C# con metodi richiamabili da altri programmi scritti in linguaggi differenti, usandola come se fosse una vera e propria dll creata in C++ (cioè unmanaged), richiamandola poi con P/Invoke in un progetto C#, ma tutto questo il C# e VB.NET non lo permette e per farlo bisogna ricorrere a qualche stratagemma.
Ora ci sono due strade che si possono prendere:
La prima è andare a disassemblare l’assembly generato e alterandone il codice IL per poi ricompilarlo nuovamente nell’assembly definitivo, ma si tratta indubbiamente di un’operazione abbastanza complicata e sicuramente poco praticabile se non per cercare di capirne i meccanismi, per avere più informazioni a riguardo consiglio la lettura di questo link che spiega per filo e per segno i meccanismi di questa tecnica permettendomi di andare già oltre.
La seconda strada è indubbiamente più semplice, ma non per questo meno funzionante anzi alla fin fine raggiungeremo lo stesso risultato, in particolare utilizzeremo un’utility chiamata dll_tool (il download include anche il sorgente).
Supponiamo quindi di avere creato un progetto di tipo libreria di classi ed avere un qualsiasi metodo, in questo caso molto semplice , simile al seguente:
public static class ProvaDll
{
public static int Somma( int a, int b )
{
return a + b;
}
}
A questo punto generiamo la nostra DLL e apriamola con dll_tool, noteremo nella lista dei metodi il nostro “Somma()” che potremo spostare nella lista degli export:
A questo punto generiamo la string table e infine compiliamo nuovamente la DLL con il pulsante build (verrà chiesto dove e con che nome salvare la nuova DLL) e il gioco è fatto, la nostra DLL potrà essere C++.
Ora per usarla per esempio in C# dobbiamo solo fare :
[DllImport("MyDll.dll")]
public static extern int Somma( int a, int b);
MessageBox.Show( Somma( 20, 55) );
Ed il gioco è fatto !