2015-07-15 30 views
11

Ich habe viele MEF-Fragen hier überprüft, aber ich kann mir nicht vorstellen, was mein Problem ist. Hier ist, was passiert:MEF Teile nicht gefunden, aber im Debug-Modus gefunden

Ich habe eine WPF-Desktop-App, die ich mit AdvancedInstaller bereitstellen. Ich benutze .NET 4.0 und MEF, um Teile zu komponieren. Einige Teile befinden sich im Hauptprojekt und befinden sich daher in der Datei app.exe. Andere Teile befinden sich in Klassenbibliotheken, die auf das Hauptprojekt verweisen, also befinden sie sich in somename.dll-Dateien. Das Problem: Beim Ausführen der App von VS, sowohl in Debug und in Release, alles ist in Ordnung. Nach der Bereitstellung der App geben einige DLLs an, dass sie keine Teile (null) zum Exportieren haben.

überprüfte ich die folgenden:

  • alle DLLs in der Bereitstellung verfügbar sind und der Katalog die Dateien
  • die Exporttypen und Namen findet korrekt sind, nachdem alle, während in Visual Studio funktioniert alles
  • wenn ich versuche, die teile aus den dlls hinzuzufügen, bekomme ich, dass die anzahl der teile null ist NUR IM EINSATZ.

Dies ist der Code, der Teile in der entfalteten App nicht findind ist:

var catalog = new DirectoryCatalog(".", "*"); 
:

var catalog = new AggregateCatalog(); 
string path = Environment.CurrentDirectory.ToString(); 
DirectoryCatalog qualitycontrol = new DirectoryCatalog(".", "QualityControl.exe"); //this is my main assembly 
DirectoryCatalog qualitymix; 

catalog.Catalogs.Add(qualitycontrol); //this finds the parts and always works fine 

if (File.Exists(path + @"\QualityMix.dll")) 
{ 
    qualitymix = new DirectoryCatalog(".", "QualityMix.dll"); //the file exists in the deployment 
    catalog.Catalogs.Add(qualitymix); //the "qualitymix" catalog shows more than 20 parts if run with VS, but 0 parts in deployment 
} 

Das einzige, was die folgende funktioniert (aber es ist sehr langsam, um die App zu starten) ist

Dies hat das Problem, dass es mehr als 100 Dateien im Arbeitsverzeichnis überprüfen muss, und ich kann meine Plugin-DLLs nicht in einem anderen Verzeichnis bereitstellen.

Warum findet ein DirectoryCatalog, das alle Dateien sucht, die Teile, aber ein DirectoryCatalog, der einen einzelnen Teil betrachtet, nicht? Wie kann ich dieses Problem beheben, wenn es nur in der bereitgestellten App passiert?

--- Edit: Dieses Problem tritt nur bei bestimmten DLLs, die Dateien gefunden werden und für andere DLLs die Teile auch gefunden werden. Ich benutze das gleiche Export/Import-Verfahren in allen DLLs, aber irgendwie zeigen einige von ihnen keine Teile in der Bereitstellung

Alles, was Sie vorschlagen können, wird hilfreich sein, danke Jungs!


NEUE INFO!

Ich habe versucht, meine DLL mit einem AssemblyCatalog zu laden. Es funktioniert in Visual Studio (Debug und Release), aber wenn ich die folgenden Fehler bekommen eingesetzt:

1. Versuch:

if (File.Exists(path + @"\QualityMix.dll")) 
    {       
     qualitymix = new AssemblyCatalog(Assembly.LoadFile(path + @"\QualityMix.dll")); //file is loaded and parts found in VS 

     catalog.Catalogs.Add(qualitymix); 
    } 

Fehler: Das Modul eine Assembly-Manifest enthalten war zu erwarten. (Ausnahme von HRESULT: 0x80131018).

Zweiter Versuch:

if (File.Exists(path + @"\QualityMix.dll")) 
    { 
     var name = AssemblyName.GetAssemblyName(path + @"\QualityMix.dll"); 
     qualitymix = new AssemblyCatalog(Assembly.Load(name)); 

     catalog.Catalogs.Add(qualitymix); 
    } 

Fehler: Konnte Datei oder Assembly 'QualityMix.dll' oder eine ihrer Abhängigkeiten laden. Es wurde versucht, ein Programm mit einem falschen Format zu laden.

Ich habe nach Fragen zu diesen Fehlern gesucht, aber bisher war nichts hilfreich. Alle Projekte werden für Alle CPUs erstellt, und die Referenzen sehen gut aus (diese DLL verwendet dieselben Referenzen wie andere Projekte, die geladen werden).


Edit 2:

habe ich versucht, den Vorschlag von @SuryaBhaskar Loadfrom zu verwenden anstelle von Last

if (File.Exists(path + @"\QualityMix.dll")) 
    { 
     qualitymix = new AssemblyCatalog(Assembly.LoadFrom(path + @"\QualityMix.dll")); 

     catalog.Catalogs.Add(qualitymix); 
    } 

Aber ich bekomme den gleichen Fehler: Konnte Datei oder Assembly ‚QualityMix laden. dll 'oder eine seiner Abhängigkeiten. Es wurde versucht, ein Programm mit einem falschen Format zu laden.

+0

Ist Environment.CurrentDirectory das in der bereitgestellten Anwendung erwartete? Überprüfen Sie, was es in beiden Fällen zurückgibt – VMaleev

+0

Danke @VMaleev für Ihren Vorschlag. Das CurrentDirectory ist in Ordnung, es findet die DLL-Datei in Ordnung. – Hannish

+0

Ich versuchte diese Lösung vergebens: http://StackOverflow.com/Questions/9119224/mef-parts-list-Sometimes-Epty?rq=1 – Hannish

Antwort

0

ich, indem Sie den Code der problematische DLL in ein neues Projekt, dieses Problem zu lösen geführt. Das hat das Problem irgendwie gelöst ... obwohl der Grund für mich ein Geheimnis bleibt.

-1

Verwendung Loadfrom statt Loadfile oder Load.If Sie Load verwenden es wird auf aktuelle AppDomain mit anderen Baugruppen Konflikte haben

+0

Vielen Dank für Ihre Antwort. Bitte geben Sie ein Codebeispiel für Ihre vorgeschlagene Lösung an, um eine Stimme zu erhalten. – Hannish

+0

container.ComposeParts(); var assemblies = aggregateKatalog.Parts.Select (teil => ReflectionModelServices.GetPartType (part) .Value.Assembly) .Distinct(). ToList(); foreach (Assembly dll in Assemblies) { // Basierend auf den Bedingungen laden Sie Ihre Baugruppe auf die richtige Assembly Variable assmbly = Assembly.LoadFrom (dll.Location); \t} – SuryaBhaskar

+0

Dank @SuryaBhaskar, aber Sie sollten Ihre Antwort so bearbeiten, dass es für jedermann leicht sichtbar ist. Sie erhalten mehr Stimmen, je besser Ihre Antwort ist. Ich werde deine Herangehensweise versuchen und dich wissen lassen. – Hannish