2009-07-31 6 views
7

Ho creato un'applicazione console utilizzando C# che fa riferimento a DLL esterne. Quando lo eseguo sulla mia macchina dev, tutto funziona correttamente. Sul computer di produzione, ricevo un errore di "inizializzazione del tipo". Analizzando questo, sembra che l'app non possa trovare le DLL di riferimento.In che modo un'applicazione di console .NET cerca gli assembly referenziati?

Nella mia casella di sviluppo, le DLL di riferimento si trovano nel GAC, ma non in quello di produzione. Quando si rimuovono le DLL dal GAC sulla casella di sviluppo, si verifica lo stesso errore (a meno che non venga eseguito da una build di Visual Studio locale in modalità di debug).

Sono più familiare con le configurazioni del sito Web e so che le DLL possono essere collocate nella directory bin o GAC in modo che possano essere trovate dall'applicazione web. Ma non sono sicuro di come funzioni per le console.

Sono riluttante a inserire la DLL nel GAC sulla scatola di produzione, poiché è necessaria solo per questa piccola applicazione. Esistono altri modi per implementare l'app della console e trovare gli assembly necessari?

Qui è l'eccezione che sto ricevendo:

di errore 1 Il tipo o dello spazio dei nomi il nome 'Entry' non è stato trovato (sei tu manca un un riferimento all'assembly direttiva using o?) C: \ documenti e Settings \ Hacker \ documenti \ Visual Studio 2005 \ Projects \ base \ base \ Program.cs 10 8 di base

risposta

11

la risposta più semplice è quello di mettere la DLL nella stessa directory come applicazione di Console e li troverà.

La risposta più lunga è abbastanza complessa in quanto vi sono molti fattori che influenzano come e dove il CLR cerca gli assembly referenziati. Vi incoraggio a dare un'occhiata al seguente articolo di MSDN che spiega dettagliatamente come funziona.

0

Quando si esamina l'eccezione che si ottiene (e potrebbe essere necessario fare un tuffo nel eccezione interna), si dovrebbe vedere un registro di tutte le posizioni ricercate (il "registro di fusione") .

Si consiglia di posizionare le DLL dipendenti nella stessa directory dell'app per console.

+0

In realtà, ha solo bisogno di visualizzare 'ex.ToString()'. –

2

Il GAC (Global Assembly Cache) registra i file .dll in modo da non doverli averli nella directory di lavoro dell'applicazione. Tutti i file .dll di .NET (System.IO.dll, System.dll, ecc.) Vengono registrati tramite GAC, il che significa che non è necessario averli nella directory dell'applicazione. Per impostazione predefinita, se un file .dll non è registrato nel GAC, il programma cercherà nella propria directory il dll mancante.

Quindi, sono disponibili tre opzioni:

  1. Aggiungi la tua dll di riferimento di al GAC, o
  2. Aggiungi il tuo riferimento.dll di nella directory di lavoro dell'applicazione
  3. Vai al tuo riferimenti sulla soluzione/progetto e selezionare le proprietà per quel riferimento, impostare "CopyLocal = true" (credito al Partha sopra per questo)
3

 
- Right click on the assembly name in your project reference. 
- select Properties 
- In the properties window set CopyLocal to true 

+0

Oh, ho dimenticato di dirlo nella mia risposta. : P +1 – Zack

0

È possibile distribuire le DLL di riferimento dove si desidera. Devi aggiungere un file App.config (aggiungi/nuovo elemento/file di configurazione dell'applicazione) al tuo progetto di base e utilizzare la verifica dei tag (configurazione/runtime/assemblybinding/probing) per indicare un percorso per le tue DLL.

È necessario copiare la DLL o DLL per quel percorso e aggiungere un riferimento ad esso nel progetto. Nelle proprietà di riferimento metti "copia locale" su "falso".