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 !