Utilizzo di una dll .NET da codice 'nativo' (parte 1)

Posted by Maurizio Attanasi on November 01, 2014 · 4 mins read
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.
/// <summary>
/// Returns the location latitude
/// </summary>
public double Latitude { get; private set; }

/// <summary>
/// Returns the location longitude
/// </summary>
public double Longitude { get; private set; }


/// <summary>
/// Set the desired location address
/// </summary>
public string Address { get; set; }

/// <summary>
/// Gets the location coordinates from the Google Maps API Web Service
/// https://developers.google.com/maps/documentation/geocoding/
/// </summary>
/// <returns>true on success, false otherwise</returns>
public bool GetCoordinates()
{
...
}

Per testare immediatamente la dll prodotta ho implementato una semplice applicazione WinForm. Il risultato è illustrato nell’immagine che segue:
dotNETCrashTestDummy
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.
Creative Commons Quality is not for sale