2009-05-07 5 views
2

Ich versuche, Plugins zu meinem Programm hinzuzufügen, und das sieht gut aus, außer dass ich den richtigen Typ von der DLL nicht übertragen kann. Ich habe eine Lösung mit mehreren Projekten darauf. Eines des Projekts ein Land Schicht ist, die eine CountryBase tatsächlich hält (definiert als öffentliche abstrakte Klasse CountryBase: CountryLayers.ICountryBase) Das Interface (öffentliche Schnittstelle ICountryBase)Problem mit dem dynamischen Laden einer DLL in mein Programm

an einem anderen Projekt ich die „Implementation“ für die haben Land. Diese DLL wird zur Laufzeit geladen, dies mit:

  Assembly assembly = Assembly.LoadFrom(file); 
      //get the class from the assembly 
      foreach (Type t in assembly.GetTypes()) 
      { 
//just for debugging 
       Console.WriteLine(t.FullName); 
      } 

      Type localType = assembly.GetType("CountryLayers.Local"); 
      if (localType != null) 
      { 
       Country countrydata = new Country(); 
       countrydata.ObjectType = localType; 
       countrydata.CountryObject = Activator.CreateInstance(localType); 
       countrydata.CountryObject2 = (CountryBase) countrydata.CountryObject; 
       countrydata.FileName = file; 
       CountryList.Add(countrydata); 
      } 

Wo Lokalen der Name der Klasse, die als öffentliche Klasse Local definiert: CountryLayers.CountryBase,

CountryLayers.ICountryBase

countrydata nur hält Zeiger. CountryObject2 ist als CountryBase definiert (ich habe es auch als IcountryBase versucht). Aber es hat immer zurückgegeben, dass der Typ nicht umwandelbar ist.

Die Schreibkonsole der Konsole zeigte, dass in der Assembly alle Klassen geladen sind, die zum Länderlayer und auch zur lokalen Klasse gehören.

Also An diesem Punkt weiß ich nicht, ob der Fehler liegt, weil ich alles auf der gleichen Lösung habe, oder das Problem ist, dass ich die Schnittstelle und die abstrakte Klasse in einer fehlerhaften Reihenfolge verwende. Wenn die create-Instanz das Objekt zurückgibt, enthält dieses Objekt alle in der abstrakten Klasse definierten Eigenschaften, aber keine Methode.

Antwort

1

Ich löse es selbst. Das Problem tritt auf, wenn Sie alles mithilfe der Lösung kompilieren. Auf diese Weise erstellt es DLL für die Schnittstellen auch in der Ausgabe der anderen Klassen. In diesem Sinne benutzte ich einen Plugin-Ordner, um die Plugins zu behalten, und stellte den VS so ein, dass er die Ausgabe in diesen Ordner kompilierte. Es kopiert die abgeleitete Klasse in diesen Ordner, zusammen mit der Schnittstellen-DLL und der abstrakten Implementierungs-DLL. Das hat den Compiler verwirrt. Ich nehme jede Referenz für Projekte im VS heraus (ich ändere sie zum Verweis auf die "kompilierte" DLL), ich kompiliere jede DLL selbst, und dann kopiere ich nur die DLL, die ich brauchte, in den Plugin-Ordner und arbeitete. Wie auch immer diese Verbindung gab mir einen Tipp über das Problem: Dynamic Loading with Reflection

0

Ich habe eine ähnliche Situation in der Vergangenheit erlebt, als die DLL, die Sie geladen haben, dynamisch eine andere Version der DLL referenziert, die die Basisklasse enthält (CountryBase in Ihrem Fall, denke ich).

+0

Aber ich habe alles auf der gleiche Lösung jetzt, für das Debuggen und Testen .. und nicht funktioniert .. (gleiche Lösung, anderes Projekt für jeden von ihnen) ... – gbianchi