2009-04-22 7 views
0

J'ai un de ces problèmes ennuyeux où quelque chose qui travaillait auparavant a cessé de fonctionner. Consultez ce code:ASP.NET - Comment arrêter les classes/dll d'un projet en cours de compilation dans un autre projet

Assembly _abc_assembly = Assembly.LoadFile(“c:\junk\abcabstract\bin\abc.dll”); 

ABC.ContentAttribute attribute; 
attribute = (ABC.ContentAttribute)_abc_assembly.CreateInstance("ABC.TextAttribute"); 

ContentAttribute est défini dans la dll. Évidemment, cela devrait fonctionner. Vous devriez être capable de lancer un objet sur lui-même.

Mais il produit cette erreur:

alt text http://www.yart.com.au/stackoverflow/compile1.png

Ce bug est discuté ici http://www.yoda.arachsys.com/csharp/plugin.html qui est la façon dont je suis même loin. De ce post, je comprends que la classe ContentAttribute est en quelque sorte se terminant par ABC.DLL et la DLL du projet de site Web.

Le projet de site je ressemble à ceci:

alt text http://www.yart.com.au/stackoverflow/compile2.png

Maintenant ContentAttribute est pas dans ce projet, il est dans le ABC.DLL dll. Vous pouvez voir cela comme j'ai développé chaque branche et le fichier ContentAttribute.cs n'est pas là. Pourtant, il se trouve en quelque sorte dans la DLL pour le site Web créant une référence de duplication. ContentAttribute se termine en quelque sorte dans ABC.DLL et la DLL du projet de site Web.

Quelqu'un peut-il me dire:

a) Pourquoi est-ContentAttribute en deux dll? Je ne pensais pas inclure une DLL dans un projet forcé ce code dans la DLL des projets.

b) Comment empêcher que cela se produise? En passant, je ne veux définitivement pas changer le projet de site Web en une application de site Web si je peux l'éviter.

Notes:

Suppression des fichiers temporaires ASP.NET ne fonctionne pas. Dès que je compile mon projet de site Web, ils sont recréés.

alt text http://www.yart.com.au/stackoverflow/compile3.png

Répondre

0

ABC.DLL est référencé par votre site Web et il devient une partie de celui-ci (il est dans le dossier Bin). ASP.NET compile votre site Web et ABC.DLL est placé dans l'emplacement temporaire (C: \ Windows ... \ Temporary ASP.NET Filse ...). Il est automatiquement chargé par ASP.NET. Vous essayez de charger manuellement ABC.DLL à partir d'un emplacement différent (D: \ junk \ abcabstract \ bin \ abc.dl). Deux assemblages ne correspondent pas, d'où l'erreur.

Pour empêcher cela, vous devez repenser votre architecture de plugin, je suppose. Pouvez-vous donner plus d'informations?

Mise à jour: Pourquoi ne pas vous fixer comme ceci:

// Assembly _abc_assembly = Assembly.LoadFile(“c:\junk\abcabstract\bin\abc.dll”); 
// ContentAttribute attribute; 
// attribute = (ContentAttribute)_abc_assembly.CreateInstance("ABC.TextAttribute"); 
ContentAttribute attribute = new ContentAttribute(); 
+0

je pourrais jurer ne se produisait pas il y a un jour. Il n'y a pas encore de vraie architecture ici, c'est un projet de test, j'en ai juste besoin pour travailler! – Petras

+0

Pourquoi avez-vous besoin de charger l'assemblage en utilisant le chemin complet? J'ai ajouté du code qui crée une instance ContentAttribute sans réflexion. –

+0

Je dois examiner les classes en utilisant la réflexion et renvoyer certains types à un type de base lorsque j'effectue certaines opérations. Le code ci-dessus n'est pas réaliste mais indique clairement le problème. – Petras

0

Il y a une collision d'espace de noms. Il ne sait pas quel ContentAttribute utiliser car il trouve 2 dans différents espaces de noms/assemblages.

Vous pouvez avoir une ancienne copie de la DLL nommée différemment. Supprimez vos répertoires temporaires ASP.Net et recompilez.

Pour éviter à l'avenir:

utiliser des noms qualifiés pour vos objets si vous avez besoin pour le faire fonctionner.

ABC.ContentAttribute ca = new ABC.ContentAttribute(); 

ou si coulée font la même

ABC.ContentAttribute ca =(ABC.ContentAttribute)ca2; 
+0

J'ai ajouté des noms complets et supprimé tous les fichiers temporaires, mais cela ne fonctionne toujours pas. Voir ma question mise à jour. – Petras

+0

cela pourrait être une question stupide, mais dans votre code en haut, vous appelez load à partir de "C: \" alors que le projet est dans le lecteur "D: \". et puisque vous lancez TextAttribute, je suppose qu'il hérite de ContentAttribute ou que cela ne fonctionnerait pas. Et le message d'erreur me porte à croire que vous devriez regarder dans le Default.aspx.cs que je ne vois pas dans votre projet. Peut-être son caché, cliquez sur "Afficher les fichiers cachés" en haut de l'explorateur de solution. –

Questions connexes