Home Page Home Page Articoli Come sfruttare le funzioni di una DLL unmanaged esterna creata in C/C++

Come sfruttare le funzioni di una DLL unmanaged esterna creata in C/C++

Come usare la classe DllImportAttribute messa a disposizione dal namespace System.Runtime.InteropServices per sfruttare le funzioni di una DLL unmanaged Win32 old-style scritta con Visual C++ 6.0
Autore: David De Giacomi Livello:
Abbiamo visto nella prima parte dell'articolo (vedete link nel box in fondo alla pagina), come costruire una DLL utilizzando Visual C++.
E' necessario ora completare il nostro discorso utilizzando la DLL in un progetto .NET e utilizzando la sua funzione che abbiamo costruito appositamente chiamata Somma.

Si comincia innanzitutto lanciando il nostro ambiente Visual Studio .NET e creando come al solito un nuovo progetto di tipo "Windows Application", in linguaggio C#.
Diamo il nome "CallDLL" al progetto.
Come indiciato precedentemente per poter utilizzare la funziona Somma, dovremo ricorrere ad una classe fornita dal Framework dal namespace System.Runtime.InteropServices.
Quindi come primo passo fra la lista dei namespace referenziati bisogna aggiungere la seguente riga:


using System.Runtime.InteropServices;


(Per accedere al codice è sufficiente fare click con il tasto destro sulla form e premere "View Code")

Come secondo passo, copiamo la DLL creata nell'articolo precedente nella cartella "Debug" o "Release" (dipende in che modalità stiamo lavorando) in modo che l'eseguibile possa vederla.
Per chi lo desidera, si può anche copiare la DLL nella cartella System32 della cartella di Windows, in questo modo sarà sicuramente visibile.

Siamo pronti per iniziare, ma prima una breve introduzione sul namespace InteropServices.

Che cosa è System.Runtime.InteropServices?
Come segnalato nella prima parte dell'articolo, la maggior parte del codice in circolazione è ancora scritto con i linguaggi di vecchia generazione, e per migrare le applicazioni è necessario parecchio tempo e spesso non è così semplice.
Ricordiamo che molti dei componenti in circolazione sono componenti basati su tecnologia COM/COM+/DCOM, ActiveX ecc.
Era necessario poter richiamare questi oggetti/moduli dalle nuove applicazioni scritte in .NET. Ecco quindi il perchè di queste classi speciali, che infatti servono per poter operare con i "vecchi componenti", così come accedere alle API native.
Come potete vedere dalla documentazione del Framework questo namespace comprende veramente molte classi, cominciamo a vederne una molto importante.

DllImportAttribute
Torniamo dove avevamo lasciato il discorso.
Visualizziamo nuovamente il codice dell'applicazione.
Dopo la definizione di classe aggiungiamo il seguente codice:


[DllImport("SumDll.dll")]
public static extern int Somma(int a,int b);


il risultato dovrebbe essere il seguente:


using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;

namespace CallDLL
{
public class Form1 : System.Windows.Forms.Form
{
[DllImport("SumDll.dll")]
public static extern int Somma(int a,int b);
//Altro codice....


Bene, come vedete, utilizziamo DllImport per indicare al compilatore che stiamo importando una funzione dalla libreria SumDll.dll e di seguito troviamo il prototipo della funziona esportata.
In questo caso il tipo di dati int si rimappa correttamente con gli interi di C/C++.
Se avessimo avuto come parametri delle stringhe oppure delle strutture da noi create dovevamo anche ricorrere all'attributo MarshalAsAttribute per definire il Marshaling dei parametri.
Il Marshaling non è altro che il processo di mapping fra tipi di variabili managed e unmanaged e viceversa in modo da non creare ambiguità nelle chiamate. Ma il nostro obbiettivo è far comprendere in modo semplice come poter richiamare le funzioni di librerie esterne da .NET.

Compiling... Building... Running!
Manca solo una riga di codice per poter testare la nostra applicazione: è la chiamata alla funziona appena definita.
Tasto destro sulla form e "View Code". L'ambiente ci posizionerà direttamente all'interno del metodo Load della nostra Form.
Aggiungiamo le seguenti righe di codice in modo da ottenre questo output:


private void Form1_Load(object sender, System.EventArgs e)
{
int a=12;
int b=48;
Console.WriteLine("Primo Addendo: " + a.ToString());
Console.WriteLine("Secondo Addendo: " + b.ToString());
Console.WriteLine("La somma è: " + Somma(a,b).ToString());
}


Il codice è sufficientemente facile da capire. Abbiamo definito le due variabili a e b di tipo int, abbiamo assegnato due valori arbitrari (12 per a, 48 per b), nelle righe seguenti visualizziamo a Console il primo addendo, il secondo, e la somma dei due utilizzando la nostra funzione.
Dal menù Debug selezionate Run.
La finestra di output dovrebbe mostrare il seguente risultato:

L'output durante l'esecuzione del programma
L'output durante l'esecuzione del programma


12+48=60! Semplice no?

Voto medio articolo: 4.2 Numero Voti: 16

File allegati


73_calldll.zip (24 Kbyte)
David De Giacomi

David De Giacomi

Unico e irripetibile Profilo completo

Articoli collegati

Importare dati di Excel con .NET tramite ODBC o OLEDB e Drag & Drop
Spesso in ambito aziendale è necessario adattare le proprie applicazioni e consentire che possano leggere e operare su file e dati provenienti dai tools della suite di Office fra cui uno dei più usati è Excel. Vediamo quindi come importare dati da file XLS tramite ODBC/OLEDB e Drag & Drop.
Autore: Marco Farina | Difficoltà:
Gestire le Access Control List (ACL) NTFS di file e directory con .NET
Scopriamo come nel .NET Framework 2.0 sia diventato facile recuperare e modificare la lista controllo accessi dei file e directory e in generale come gestire le ACL.
Autore: Marco Caruso | Difficoltà: | Commenti: 1 | Voto:
Costruire un client FTP usando il .NET Framework 2.0
In questo articolo tratteremo una delle novità più attese del .NET Framework 2.0, le classi per l'utilizzo del protocollo FTP. Realizzeremo un mini client FTP con alcune fra le funzionalità più comuni.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 28
Alla scoperta di WMI, questo sconosciuto
WMI o Windows Management Instrumentation è un componente fondamentale del sistema operativo Windows. La sua utilità è permettere l'accesso a informazioni fondamentali del sistema, come informazioni sull'hardware, software, servizi, ecc. Vediamo come sfruttarlo con .NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2
Gestire e sfruttare i campi BLOB usando .NET
I database server sono software con una potenza elevata e offrono una vasta gamma di features che spesso non vengono utilizzate. Una di queste sono i campi BLOB (campi per contenere dati in formato binario). Vediamo in questo articolo come utilizzarli con .NET.
Autore: David De Giacomi | Difficoltà: | Commenti: 13
Catturare immagini da una Webcam con .NET
In questo articolo mostreremo come è possibile costruire una applicazione per catturare immagini da una Webcam, utilizzando componenti già presenti in Windows, in questo caso l' Avicap32.dll
Autore: Giovanni Ferron | Difficoltà: | Commenti: 22 | Voto:
Usare il protocollo POP3 per creare un Client di posta
Volete costruirvi un client di posta? Volete costruire una Web Mail ? Ecco un articolo che vi introduce al protocollo POP3 e vi insegna come costruire un mini client di posta elettronica.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 2 | Voto:
La stampa di una Win Form
Vedremo in questo articolo i passi necessari per creare una stampa sia di testo che di grafica di una WinForm attraverso .NET.
Autore: Marco Caruso | Difficoltà: | Commenti: 9 | Voto:
Creare un Setup di un progetto con Visual Studio .NET
Ecco delle semplici ma dettagliate istruzioni passo-passo per costruire un pacchetto di Setup (Setup Package) per le nostre Applicazioni WinForms.
Autore: Marco Caruso | Difficoltà: | Commenti: 18
Creare un?icona nella Taskbar di Windows con .NET
Scoprirete come potenziare la vostra applicazione aggiungendo un'icona nella barra di Windows nella famosa Tray Area a fianco dell'orologio del sistema. Disponibile sia codice VB.NET che C#.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 1 | Voto:
Costruire un Servizio di Windows usando .NET
Un avanzato tutorial che vi spiegherà passo passo e in modo dettagliato le istruzioni per costruire un Servizio Windows, utilizzando ciò che il .NET Framework ci mette a disposizione. Disponibile sia codice C# che VB.NET.
Autore: Giovanni Ferron | Difficoltà: | Commenti: 13 | Voto:
Windows XP Visual Styles con .NET e Win Forms
Come usare lo stile XP nelle vostre applicazioni .NET ? Questo articolo vi spiega come applicare a Buttons, Textbox, ListViews (ai controlli di Windows in genere) lo stile/tema grafico della GUI introdotto dal sistema operativo Windows XP.
Autore: David De Giacomi | Difficoltà: | Commenti: 7
Creare una DLL in Visual C++ 6.0
Vedremo in questo articolo come creare una Dynamic Link Link Library, comunemente chiamata DLL con Visual C++ 6.0. Questo passo è necessario per poi dimostrare l'utilizzo di librerie C/C++ in .NET tramite il package System.Runtime.InteropServices
Autore: David De Giacomi | Difficoltà: | Commenti: 11 | Voto:
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5