Wir implementieren ein Plugin-Framework für unsere Anwendung und laden Plugins mit Assembly.Loadfrom. Wir verwenden dann GetTypes() und untersuchen die Typen mit jeder Plugin-Datei für unterstützte Schnittstellen.Assembly.GetTypes() - ReflectionTypeLoadException
Ein Pfad für die Plugins wird vom Benutzer bereitgestellt und wir durchlaufen alle Dateien im Ordner, um zu sehen, ob es (das Plugin) unsere Plugin-Schnittstelle unterstützt. Wenn dies der Fall ist, erstellen wir eine Instanz, andernfalls gehen wir zur nächsten Datei über.
Wir erstellen zwei Versionen von Software aus der einen Codebasis (appA_1 und appA_2).
Das Laden der Plugins funktioniert gut, wenn die Plugins von der Anwendung geladen werden, die zur gleichen Zeit wie die Plugin-Datei erstellt wurde. Wenn wir jedoch appA_2 erstellen und auf den Plug-in-Ordner appA_1 verweisen, erhalten wir eine Ausnahme, wenn GetTypes() aufgerufen wird.
Eine Grundversion unseres Codes ist;
var pluginAssembly = Assembly.LoadFrom(FileName);
foreach (var pluginType in pluginAssembly.GetTypes())
{
Wir erhalten eine "ReflectionTypeLoadException" Ausnahme.
Dies ist wichtig, weil wir wollen, dass unsere Anwendung die Typen eines von jedem erstellten Plugins laden kann. Gibt es etwas, das uns fehlt?
EDIT: Nachdem die Loaderexceptions Durchlaufen wir entdeckt haben, dass es eine einzelne Datei libPublic.dll ist, die eine System.IO.FileNotFoundException Ausnahme erzeugt. Das Seltsame ist, dass sich diese Datei im Anwendungsverzeichnis befindet und das Plugin auf die Projektdatei verweist.
EDIT 2: Im Ausnahmeprotokoll wir die folgenden finden "Vergleicht man die Assemblierung-Name ergab die Diskrepanz: Revisionsnummer"
Was ist die Ausnahmebedingungsnachricht? Hat die Ausnahme eine innere Ausnahme? Was ist die Botschaft davon? – dtb
Gibt es einen Grund, warum Sie kein vorhandenes Framework wie MEF verwenden? – dtb
Sie können immer noch Probleme wie diese verursachen, wenn Sie MEF verwenden, obwohl MEF definitiv praktisch ist, um sich um die Arbeit des Grunzens zu kümmern. –