Domanda

  1. Qual è la differenza di creare una semplice DLL C tra l'utilizzo di Visual Studio 2005 e Visual C ++. Ho visto che durante la creazione di sotto di studio anche un manifesto è stato creato e ho avuto alcuni problemi per quanto riguarda la distribuzione in un'altra macchina a causa dell'utilizzo di cartella side-by-side (al momento della chiamata che dll formano un'applicazione C # "
  2. Come funziona il meccanismo di chiamare un'opera dll?

Grazie

È stato utile?

Soluzione

Dal nobugz già coperto la prima domanda, mi permetta di espandere sul secondo. Non è terribilmente difficile da capire.

Quando si compila una DLL in Windows, il linker crea una tabella Export Indirizzo (EAT) che elenca tutte le funzioni esportate (le funzioni della DLL fornisce) e l'indicazione di dove la loro applicazione nella DLL per sé.

Quando si compila un'applicazione che si collega a una DLL, il linker crea un Import Address Table (IAT) elenco di tutte le funzioni che vengono implementati in altre DLL e il nome della DLL che implementa tali funzioni. Il modo in cui sa che esiste una funzione in una DLL è dal file .lib che si aggiunge al progetto. Questo dice il linker che una funzione è implementata in una DLL.

Poi in fase di esecuzione, durante il caricamento di un'applicazione il caricatore di Windows esamina l'IAT per vedere che cosa il bisogno di DLL da caricare, li individua e aggiorna le applicazioni IAT (in memoria) per puntare alle funzioni esportate della DLL caricata.

Ecco le nozioni di base come funziona, si spera non ho incluso eventuali inesattezze grossolane. E, naturalmente, P / Invoke è un altro strato in cima a questo.

Se volete maggiori informazioni su come il lavoro di DLL c'è sempre la MSDN documentazione e se volete dettagli sufficienti per farvi girare la testa leggere questi articoli all'interno di Windows Parte 1 e Parte 2

Altri suggerimenti

Sì, se si compila il codice della DLL con / MD (l'impostazione predefinita) allora dovete distribuire le librerie CRT alla macchina di destinazione. Se questo è solo un DLL autonoma senza altre dipendenze allora ha senso per compilare con l'opzione CRT statica in modo da non dover distribuire le librerie. Fare clic con il progetto DLL, Proprietà, C / C ++, generazione di codice, libreria di Runtime = / MTd per la configurazione di debug. Ripetere l'operazione per la configurazione di rilascio, ora utilizzando / MT.

Google "P / Invoke marshaling" per saperne di più su come non gestito codice viene chiamato da un programma gestito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top