2016-10-19 3 views
1

J'essaye de déployer un plugin à un client. Nous utilisons des attributs MEF, import, export. J'utilise l'exportation et le client l'importe Mon application utilise DevExpress XtraGrid, XtraEditors et beaucoup d'autres DLL DevExpress (voir capture d'écran), System.Data.Services. En dépit de fournir toutes ces DLL requises et beaucoup de leurs dépendances, le plugin semble toujours exiger DevExpress.ExpressApp. DevExpress.ExpressApp et toutes ses autres dépendances ne sont définitivement pas nécessaires.Pourquoi cette DLL DevExpress.ExpressApp se charge-t-elle?

Comme le client continuait de se plaindre d'une exception FileNotFound, j'ai décidé de faire un projet de test pour importer mon propre plugin. Ceci est mon code de test pour tester la théorie des clients qu'il obtient est la suivante.

System.IO.FileNotFoundException: Could not load file or assembly 'DevExpress.ExpressApp.v14.2, Version=14.2.7.0, 


Our Plugin 
    [Export(typeof (ISomething))] 
     public class MyClass : ISomething 
     { 

    } 
TESTER 
    class Program 
    { 
      [ImportMany] 
     public IEnumerable<ISomething> Somethings { get; set; } 
     static void Main(string[] args) 
     { 

      var rp = new Program(); 
      rp.Run(); 


     } 
     public void Run() 
     { 
      Compose(); 

     } 
     public void Compose() 
     { 
      try 
      { 
       AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler; 
       AggregateCatalog aggregatecatalogue = new AggregateCatalog(); 
       aggregatecatalogue.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
       CompositionContainer container = new CompositionContainer(aggregatecatalogue); 
       CompositionBatch batch = new CompositionBatch(); 
       batch.AddPart(this); 
       container.Compose(batch); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

     } 

     static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e) 
     { 
      System.Text.StringBuilder msg = new System.Text.StringBuilder(); 
      msg.AppendLine(e.Exception.GetType().FullName); 
      msg.AppendLine(e.Exception.Message); 
      System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); 
      msg.AppendLine(st.ToString()); 
      msg.AppendLine(); 
      String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      string logFilePath = String.Format("{0}\\{1}", desktopPath, "logfile.txt"); 
      System.IO.File.AppendAllText(logFilePath, msg.ToString()); 

     } 

Effectivement, j'ai vu dans la fenêtre de sortie et a découvert qu'il chargeait en effet cette DLL et certaines dépendances liées à ExpressApp du GAC. Question: Comment puis-je savoir où et pourquoi ExpressApp est-il nécessaire? Je peux simplement simplement livrer la DLL, mais cela continue encore et encore sur une tonne de dépendances dont j'ai compris pourquoi ils seraient nécessaires.

enter image description here

+0

avez-vous de la chance pour résoudre votre problème? – andrews

Répondre

1

il existe des outils pour le contrôle des dépendances d'assemblage gérés. Le SDK MS Windows contient l'utilitaire ildasm.exe. Il y a des chances que vous l'avez déjà installé dans:

C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v8.0A \ bin \ netfx 4.0 Outils \ ildasm.exe

Quand j'ai eu un problème similaire (c'était une incompatibilité de version dll) J'ai également utilisé 'grep' de cygwin depuis la ligne de commande pour rechercher la chaîne de dépendance manquante sur tous les DX et nos assemblys personnalisés pour localiser le fichier .dll réel référençant la version de DLL manquante. Puis l'a ouvert dans ildasm.exe et a cliqué deux fois sur le noeud de l'arbre MANIFEST. Là, j'ai vu la référence à la version .dll que je n'avais pas.

Vous pouvez suivre les mêmes étapes pour essayer de suivre la dépendance manquante. Exécutez la recherche de chaîne "DevExpress.ExpressApp" sur toutes les DLL DX dans le répertoire bin de votre projet, puis, si le résultat est trouvé, ouvrez le fichier signalé avec ildasm.exe

Notez que vous n'avez probablement pas 'grep' du https://www.cygwin.com/ installé, utilisez l'utilitaire de recherche de chaîne disponible.

Il existe également d'autres outils tiers pour la vérification des dépendances dll, mais ceux-ci doivent être installés séparément, alors que ildasm.exe fait partie de Windows SDK. Voir d'autres refs outils réponses de cette question:

How do I determine the dependencies of a .NET application?

MISE À JOUR:

si vous n'avez pas tous vos DX libs dans le dossier bin parce que votre application est un plug-in et utilise DX libs directement à partir GAC, vous pouvez rechercher des références dans le DevExpress.ExpressApp droit dossier d'installation de DX, dans mon cas:

C: \ Program Files (x86) \ DevExpress 15.2 \ Components \ Bin \ Framework

J'ai copié le contenu du dossier ci-dessus dans un dossier temporaire, supprimé tous les sous-dossiers de paramètres régionaux ainsi que tous DevExpress.ExpressApp.* dll et puis a couru une commande:

grep -nr "DevExpress.ExpressApp" 

qui a produit les résultats suivants:

Binary file DevExpress.EasyTest.v15.2.dll matches 
Binary file DevExpress.Persistent.Base.v15.2.dll matches 
Binary file DevExpress.Persistent.BaseImpl.EF.v15.2.dll matches 
Binary file DevExpress.Persistent.BaseImpl.v15.2.dll matches 
Binary file DevExpress.Workflow.Activities.v15.2.Design.dll matches 
Binary file DevExpress.Workflow.Activities.v15.2.dll matches 

voir si l'un des dll ci-dessus est utilisé soit par votre plug-in ou l'application hôte où le plug-in est de être déployé.

HTH

+0

Bonjour, je n'ai pas eu de chance. Merci pour les conseils. J'apprécie vraiment.Oh man .. Cela a été un torcher. Vraiment apprécier vos conseils. – user575219

+0

J'aime l'idée d'utiliser grep et de chercher une chaîne, qui serait la DLL manquante. Tu as raison. J'ai passé une journée là-dessus à comprendre que ExpressApp est utilisé par Peristent.BaseImpl. Mais ensuite j'ai continué à comprendre le cycle. Je ne me souviens pas vraiment pourquoi j'avais besoin de BaseImpl. Quoi qu'il en soit Merci! – user575219

+0

BaseImpl peut être demandé non directement par votre plugin/application mais par un autre DX lib de la liste des références. Merci d'avoir accepté ma réponse et voté! – andrews