2010-03-29 18 views
0

Je rencontre un problème lors de la configuration de Visual Studio 2008: un projet parent qui inclut la classe de méthode entrypoint Main() et qui déclare une interface, et un projet enfant qui a les classes qui implémentent l'interface déclarée dans le projet parent.Organisation du projet Visual Studio 2008 pour l'exécutable et l'assembly

J'ai spécifié que le type de sortie de Parent est une application de console et que le type de sortie de Child est une bibliothèque de classes. Dans l'enfant, j'ai ajouté une référence au parent en tant que projet, et spécifié que l'enfant dépend du parent et que l'ordre de construction doit être parent, puis enfant.

La génération réussit, et pour autant que je peux dire, les bonnes choses apparaissent dans le répertoire Child/bin/debug: Parent.exe et Child.dll.

Cependant, si je lance Parent.exe, puis au moment où il doit charger une classe de la CHILD.DLL, il échoue avec le message d'erreur:

exception exécution System.TypeLoadException de fonctionnement: Impossible de charger tapez 'Child.some.class' à partir de l'assembly 'Parent, Version = 1.0.0.0, Culture = neutre, PublicKeyToken = null'. Je suppose que je suis confus quant à la façon de faire en sorte que les projets Parent et Enfant jouent ensemble. Je prévois d'avoir plus de projets enfants qui utilisent le même cadre que celui défini dans le Parent, et je ne veux donc pas déplacer la classe entrypoint dans le projet Enfant. Si j'essaie de spécifier que le projet enfant est également une application console, le processus de génération échoue car il n'y a pas de classe entrypoint Main() dans l'enfant (même si le projet parent est inclus comme référence).

Toute aide serait la bienvenue! Merci, Martin

Répondre

0

Vous souhaitez éviter les dépendances circulaires. Si vous souhaitez séparer l'interface et l'outil d'implémentation, définissez l'interface dans un troisième assemblage (bibliothèque de classes) utilisé par l'assembly "enfant" (bibliothèque de classes), puis utilisez l'interface et l'implémentation application.

2

Généralement, vous voulez inverser votre hiérarchie: votre projet .exe devrait dépendre de vos projets d'assemblage satellite (ce que vous appelez "Enfant"). Ensuite, pour utiliser les types dans votre assembly satellite, vous voulez ajouter une référence de votre projet .exe à votre projet d'assemblage. Pour ce faire, cliquez avec le bouton droit sur le projet .exe dans l'Explorateur de solutions de VS, puis cliquez sur Ajouter une référence ... cliquez sur l'onglet Projets et choisissez le projet d'assemblage.

Éditer: Si vous souhaitez configurer un «cadre» pour le projet global (soit en définissant interfaces ou des classes de base), alors je commencerais par le faire dans un seul ensemble de base; mettre ces définitions dans quelque chose comme MyProject.Core.dll. Vos projets/assemblages "implémentants" auront alors une référence à votre projet MyProject.Core. Avec tout cela, vous cherchez peut-être quelque chose comme un cadre COI/DI. Voir Ninject, StructureMap, Castle Windsor, etc.

0

Donc, dans la bonne tradition de répondre à ses propres questions, j'ai élaboré que pour appeler avec succès GetType(), je dois spécifier le bon assemblage. Chaque projet est compilé dans son propre assemblage (Application.exe, Interface.dll et Implementation.dll). Ainsi, afin d'instancier la classe de mise en œuvre au sein de la classe Application Main(), je dois appeler:

Type actionType = Type.GetType("ImplementationClass", "Implementation", true); 

Il semble un peu hokey, mais au moins il fonctionne.

Questions connexes