Condividi tramite


Scelta del metodo di esportazione da utilizzare

Aggiornamento: novembre 2007

Per determinare il metodo da utilizzare per l'esportazione delle funzioni, ovvero un file def o la parola chiave __declspec(dllexport), rispondere alle seguenti domande:

  • Si continuerà ad aggiungere altre funzioni esportate?

  • Chi utilizza la DLL? Si tratta, ad esempio, di una DLL di altri produttori utilizzata da molti eseguibili che non è possibile rigenerare oppure viene utilizzata solo da applicazioni facilmente rigenerabili?

Pro e contro dell'utilizzo dei file def

L'esportazione delle funzioni in un file def fornisce il controllo sugli ordinali di esportazione. Quando si aggiungono altre funzioni esportate alla DLL, è possibile assegnare ad esse valori ordinali più elevati di qualsiasi altra funzione esportata. In questi casi, le applicazioni che utilizzano il collegamento implicito non devono ricollegarsi alla nuova libreria di importazione che contiene le nuove funzioni. Questo fatto è particolarmente importante, ad esempio, se si progetta una DLL di terze parti che verrà utilizzata da molte applicazioni. È possibile continuare ad aggiungere funzionalità alla DLL garantendo al contempo il corretto funzionamento delle applicazioni esistenti con la nuova DLL. Le DLL MFC vengono generate tramite i file def.

Un altro vantaggio consiste nella possibilità di esportare le funzioni utilizzando l'attributo NONAME, che consente di inserire nella tabella di esportazione della DLL soltanto l'ordinale. Per le DLL con molte funzioni esportate, l'utilizzo dell'attributo NONAME può ridurre le dimensioni del file DLL. Per informazioni sulla scrittura di un'istruzione di definizione del modulo, vedere Regole relative alle istruzioni di definizione dei moduli. Per ulteriori informazioni sull'esportazione in base ai valori ordinali, vedere Esportazione di funzioni da una DLL in base al numero ordinale anziché al nome.

Il principale svantaggio nell'utilizzo di un file def sta nel fatto che, se si esportano funzioni in un file C++, è necessario inserire i nomi decorati nel file def o definire le funzioni esportate con il collegamento C standard utilizzando extern "C" per evitare che venga eseguita la decorazione del nome da parte del compilatore.

Per ottenere i nomi decorati da inserire nel file def, è possibile utilizzare lo strumento DUMPBIN o l'opzione /MAP del linker. I nomi decorati prodotti dal compilatore sono specifici del compilatore. Se si inseriscono i nomi decorati creati dal compilatore Visual C++ in un file def, anche le applicazioni collegate alla DLL devono essere generate utilizzando la stessa versione di Visual C++, in modo che i nomi decorati nell'applicazione chiamante corrispondano ai nomi esportati nel file def della DLL.

Pro e contro dell'utilizzo di __declspec(dllexport)

L'utilizzo di __declspec(dllexport) è vantaggioso perché evita di dover mantenere un file def e di ottenere i nomi decorati delle funzioni esportate. Questo metodo è ideale, ad esempio, se si sta progettando una DLL da utilizzare con un'applicazione che può essere controllata. Se si rigenera la DLL con nuove esportazioni, è necessario rigenerare anche l'applicazione poiché i nomi decorati delle funzioni C++ esportate potrebbero cambiare in caso di ricompilazione con una versione differente del compilatore.

Scegliere l'argomento con cui si desidera procedere

Scegliere l'argomento su cui visualizzare maggiori informazioni

Vedere anche

Concetti

Esportazione da una DLL