Circa un anno fa, un mio collega si è trovato nella condizione di dover utilizzare una dll sviluppata con tecnologia .NET, all’interno del software di controllo di un sistema di assemblaggio e test di componenti per il mercato automotive, sviluppato con un linguaggio nativo. Ovviamente la dll in questione non era COM-aware, ovvero non poteva essere utilizzata come un ActiveX (troppo facile). Poiché in azienda sono tra i pochi ad avere una certa esperienza sia con la tecnologia .NET che con linguaggi nativi, sono stato coinvolto nella ricerca di una soluzione al problema, e, dopo essermi documentato un po’, tra le varie soluzioni possibili, ho deciso di implementare quella illustrata nell’immagine che segue:
In pratica, si tratta di sfruttare la possibilità di incorporare codice gestito in una dll C++, e creare quindi un wrapper che sia in grado di rendere fruibili metodi e proprietà esposti dalla dll .NET, ad un software legacy.
Al fine di illustrare tale concetto, il resto del memorandum, che dividerò in due parti, si svilupperà nella scrittura di quanto segue:
1. una dll C# che che esporti metodi e/o proprietà;
2. un wrapper C++/CLI che renda visibili le interfacce della dll del punto precedente ad un software nativo;
3. programma di test, scritto in codice nativo che importi la dll, prodotta allo step 2 e ne usi metodi e/o proprietà.
Ho già condiviso l’intero progetto su
GitHub ed è possibile raggiungerlo dal link che segue
CLIWrapperDemo.
La libreria .NET
Il primo passo sarà quello di implementare una libreria di classi .NET attorno alla quale costruiremo il nostro wrapper. Chiameremo la libreria
GoogleMapsAPI che, com’è facile capire dal nome, sfrutterà le API di Google Maps, al fine di restituire le coordinate (longitudine e latitudine) dato un indirizzo. Per ulteriori informazioni sul servizio di geolocalizzazione ho fatto riferimento alla documentazione ufficiale
Google Maps API Web Services. Il risultato è una classe con tre proprietà ed un metodo.
public double Latitude { get; private set; }
public double Longitude { get; private set; }
public string Address { get; set; }
public bool GetCoordinates()
{
...
}
Per testare immediatamente la dll prodotta ho implementato una semplice applicazione WinForm. Il risultato è illustrato nell’immagine che segue:
Ok, abbiamo una dll .NET e non ci resta che creare il wrapper e provare ad utilizzarlo nel nostro
vecchio software
legacy.
We’ll find out in the next episode!Enjoy.