2009-07-31 8 views
7

J'ai créé une application de console en utilisant C# qui fait référence aux DLL externes. Quand je l'exécute sur ma machine de dev, tout fonctionne bien. Sur la machine de production, j'obtiens une erreur "d'initialisation de type". En regardant dans cela, il semble que cela puisse parce que l'application ne peut pas trouver les DLL référencées.Comment une application de console .NET recherche-t-elle les assemblys référencés?

Sur ma boîte de dev, les DLL référencées sont dans le GAC, mais pas sur celui de production. Lorsque vous supprimez les DLL du GAC sur la boîte de dev, la même erreur se produit (sauf si je l'exécute à partir d'une version locale de Visual Studio en mode débogage). Je connais mieux les configurations de site Web, et je sais que les DLL peuvent être placées dans le répertoire bin ou le GAC afin qu'elles puissent être trouvées par l'application web. Mais je ne suis pas sûr de la façon dont cela fonctionne pour les applications console.

Je suis réticent à mettre la DLL dans le GAC sur la boîte de production, car il est seulement nécessaire pour cette petite application. Existe-t-il d'autres moyens pour déployer l'application de console et lui demander de trouver ses assemblages requis?

Voici l'exception que je reçois:

Erreur 1 n'a pas pu être trouvé le nom de type ou espace de noms « Entrée » (êtes-vous manque une directive à l'aide ou une référence d'assemblage?) C: \ documents et Settings \ Hacker \ Mes documents \ Visual studio 2005 \ Projects \ base \ base \ Program.cs 10 8 base

Répondre

11

la réponse la plus simple est de mettre la DLL dans le même répertoire que l'application console et il les trouvera. La réponse la plus longue est assez complexe car il existe de nombreux facteurs qui influencent comment et où le CLR recherche les assemblages référencés. Je vous encourage à jeter un oeil à l'article suivant de MSDN qui va dans les moindres détails sur la façon dont cela fonctionne.

0

Lorsque vous examinez l'exception que vous obtenez (et vous devrez peut-être plonger dans l'exception interne), vous devriez voir un journal de tous les endroits les plus recherchés (le « journal de fusion ») .

Je vous recommande de placer les DLL dépendantes dans le même répertoire que votre application de console.

+0

En fait, il doit juste afficher 'ex.ToString()'. –

2

Le GAC (Global Assembly Cache) enregistre votre fichier .dll de sorte que vous ne devez pas les avoir dans le répertoire de travail de votre application. Tous les fichiers .dll de .NET (System.IO.dll, System.dll, etc.) sont enregistrés via le GAC, ce qui signifie que vous ne devez pas les avoir dans le répertoire de votre application. Par défaut, si un fichier .dll n'est pas enregistré dans le GAC, le programme cherchera dans son propre répertoire le fichier .dll manquant.

Donc, vous avez trois choix:

  1. Ajouter votre .dll de la GAC ​​fait référence, ou
  2. Ajouter votre référence.dll dans le répertoire de travail de votre application
  3. Allez à vos références sur la solution/projet et sélectionnez Propriétés pour cette référence, réglez « CopyLocal = true » (crédit à Partha ci-dessus pour cette)
3

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

+0

Oh, j'ai oublié de le mentionner dans ma réponse. : P +1 – Zack

0

Vous pouvez déployer des DLL référencées où vous le souhaitez. Vous devez ajouter un fichier App.config (ajouter/un nouvel élément/fichier de configuration d'application) à votre projet de base et utiliser le test de balise (configuration/runtime/assemblybinding/probe) pour indiquer le chemin de vos dll.

Vous devez copier la DLL ou DLL à ce chemin et ajouter une référence à celui-ci dans votre projet. Dans les propriétés de référence, mettez "copy local" sur "false".

Questions connexes