2009-09-23 7 views
2

J'essaie de faire un AddIn Visual Studio qui supprime les références inutilisées des projets dans la solution actuelle (Je sais que cela peut être fait, Resharper le fait, mais mon le client ne veut pas payer 300 licences). Anyhoo, j'utilise DTE pour faire une boucle sur les projets, compiler leurs assemblages, puis réfléchir sur ces assemblys pour obtenir leurs assemblys référencés et contre-interroger le fichier .csproj. Problème: depuis que le fichier .dll/.exe que j'ai chargé avec Reflection ne se décharge pas jusqu'à ce que l'app domian se décharge, il est maintenant verrouillé et les projets ne peuvent plus être générés car VS essaie de recréer les fichiers (tous les trucs standard). J'ai essayé de créer des fichiers temporaires, puis de réfléchir sur eux ... pas de travail, ont toujours verrouillé les fichiers originaux (je ne comprends tout à fait que BTW). Maintenant, je suis en train de créer un AppDomain temporaire pour charger les fichiers et les détruire ensuite. J'ai cependant des problèmes pour charger les fichiers:Chargement .dll/.exe à partir du fichier dans AppDomain temporaire jette Exception

La façon dont je comprends AddDomain.Load est que je devrais créer et envoyer un tableau d'octets de l'assembly. Je le fais:

FileStream fs = new FileStream(assemblyFile, FileMode.Open); 
byte[] assemblyFileBuffer = new byte[(int)fs.Length]; 
fs.Read(assemblyFileBuffer, 0, assemblyFileBuffer.Length); 
fs.Close(); 

AppDomainSetup domainSetup = new AppDomainSetup(); 
domainSetup.ApplicationBase = assemblyFileInfo.Directory.FullName; 
AppDomain tempAppDomain = AppDomain.CreateDomain("TempAppDomain", null, domainSetup); 

Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer); 

La dernière ligne déclenche une exception:

« Impossible de charger le fichier ou l'assembly 'WindowsFormsApplication1, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' ou un . de ses dépendances le système ne peut pas trouver le fichier spécifié. ":". WindowsFormsApplication3, version = 1.0.0.0, Culture = neutral, PublicKeyToken = null "}"

Toute aide ou pensées seraient grandement appréciés Ma tête est déséquilibré de le battre contre le mur ...

Merci, Dan

Répondre

1

Ce qui est presque est certainement passe ici que l'une des dépendances de WindowsFormApplication1 ne sont pas disponibles dans la construction AppDomain et donc ce n'est pas en mesure de charger WindowsFormApplication1. Afin de leur dire que vous allez devoir vérifier le journal de liaison de fusion pour voir ce qui s'est passé. Voici un excellent tutoriel sur la façon de déboguer les échecs de liaison d'assemblage pour détecter leur cause première.

+0

suggestion Grande, je l'ai fait avant de poster. Essayer d'entrer dans FusLog en ce moment et apparemment je n'ai pas tout chargé quand j'ai installé VS ... Merci! –

+0

Oui, cela m'a beaucoup aidé: je vois clairement que le répertoire de base du domaine temporaire (je suppose) est réglé sur "C:/Program Files/Microsoft Visual Studio 9.0/Common7/IDE". De toute évidence, c'est pourquoi il ne trouve pas le fichier. Seulement, maintenant ... pourquoi mon AppDomainSetup.ApplicationBase n'a-t-il pas pris ?! –

Questions connexes