2010-07-23 17 views
8

Ho visto un paio di esempi di questo tipo:Perché utilizzare Attributo DllImport come richiesto per aggiungere un riferimento?

[DllImport("user32.dll")] 
static extern bool TranslateMessage([In] ref Message lpMsg); 

[DllImport("user32.dll")] 
static extern IntPtr DispatchMessage([In] ref Message lpmsg); 

Ma, quello che non capisco è perché qualcuno dovrebbe farlo come apposto al solo riferimento alla DLL come fanno altre biblioteche? MSDN afferma: "L'attributo DllImport è molto utile quando si riutilizza il codice non gestito esistente in un'applicazione gestita, ad esempio l'applicazione gestita potrebbe dover effettuare chiamate all'API WIN32 non gestita." Ma, è detto che non è utile fare riferimento a una dll non gestita o altrimenti impossibile?

risposta

22

"Ma, è che dicendo che non è utile fare riferimento a una DLL non gestita o impossibile altrimenti?"

Sì, esattamente così. Quello a cui stai pensando come "referenziare una DLL" è in realtà "fare riferimento a un assembly .NET": è proprio così che il modo più comune di impacchettare il tipo di assembly che si tende a fare riferimento è in una DLL.

DLLImport riguarda esclusivamente l'importazione di "DLL tradizionali", ad esempio quelle che esportano tutti i loro metodi utilizzando il meccanismo di esportazione della DLL di Windows originale.

Pensare a DLLImport come effettivamente chiamato "UnmanagedImport" e le cose potrebbero essere più chiare.

2

Il codice di piattaforma .NET viene compilato nel codice gestito e viene memorizzato utilizzando gli assembly, gli assembly sono file DLL ma NON TUTTI i file .DLL sono assembly contenenti codice gestito. È possibile utilizzare solo il codice gestito con lo stile 'Aggiungi riferimento'.

Altri linguaggi e tecniche di sviluppo generano.file DLL con codice non gestito, in realtà si può anche interagire (metodi di chiamata) con loro, ma è necessario l'attributo dllimport

8

In poche parole:

  • Aggiungi riferimento è utilizzato per: file DLL che contengono codice gestito

  • DllImport è utilizzato per: file DLL che contengono codice non gestito

Definizioni:

codice gestito: codice che corsa solo sotto la gestione di un Common Language Runtime (CLR) macchina virtuale, in genere il .NET Framework (o Mono).

codice non gestito: qualsiasi binari compilati in esecuzione direttamente sul sistema operativo; DLL compilate utilizzando qualcosa di più grande di Visual Studio .NET 2002.

Maggiori dettagli: la cura Managed, Unmanaged, Native: What Kind of Code Is This?

+1

Downvoter da spiegare? – slayernoah

+3

Ti inviterò a cancellare il downvoter senza senso – YoungStacker

+0

E ho svalutato di nuovo, come questo ha spiegato bene. Così scortese di downvote. Dovrebbe essere bannato – Fandango68

Problemi correlati