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.
Ist Environment.CurrentDirectory das in der bereitgestellten Anwendung erwartete? Überprüfen Sie, was es in beiden Fällen zurückgibt – VMaleev
Danke @VMaleev für Ihren Vorschlag. Das CurrentDirectory ist in Ordnung, es findet die DLL-Datei in Ordnung. – Hannish
Ich versuchte diese Lösung vergebens: http://StackOverflow.com/Questions/9119224/mef-parts-list-Sometimes-Epty?rq=1 – Hannish