2017-08-31 1 views
3

Wir haben ein System, das stark auf "Adapter", die eine einfache Schnittstelle für die Durchführung der einzigartigen Verarbeitung implementieren. Normalerweise laden wir diese dynamisch nach Assemblynamen, aber in diesem Fall wollen wir sie einfach als "Bibliotheken" aus unserer Lösung laden. In dotnet Core 2.0 scheint dies gebrochen zu sein. Ich nehme eine kleine Probe mit, die dieses Problem aufweist. Vielleicht ist mein Design fehlerhaft oder etwas hat sich geändert. Das gleiche Muster funktioniert für uns im dotnet Framework (vor Core).Bibliotheken in Dotnet Core 2.0 erhalten FileNotFound Ausnahme

Ich bin ein Beispiel und ein Screenshot von dem, was mein Beispielprojekt aussieht, aber das ist der Jist davon.

Solution Folder Layout

Ich habe eine Dotnet Kern 2.0 "Bibliothek" genannt ExternalAdapter.

public class TheAdapter : TestExternalInterface.Interfaces.ISomeExternalAdapter 
{ 
    public string GetSomeValue(string valueType) 
    { 
     switch (valueType) 
     { 
      case "Red": 
      case "red": 
       return "Your color is red"; 
      case "Blue": 
      case "blue": 
       return "Your color is blue"; 

      default: 
       return "Unknown Value Type"; 
     } 
    } 

    public List<string> GetSomeValues(string valueType) 
    { 
     switch (valueType) 
     { 
      case "Color": 
      case "color": 
       return new List<string> { "Red", "Blue" }; 
      case "Flavor": 
      case "flavor": 
       return new List<string> { "Sweet", "Savory" }; 

      default: 
       return new List<string> { "Color", "Flavor" }; 
     } 
    } 
} 

Es hat eine Klasse in es TheAdapter benannt, die ISomeExternalAdapter-Schnittstelle implementiert.

Ich habe eine Dotnet-Core 2.0 "Konsole App", die eine neue ExternalAdapter.TheAdapter() als ISomeExternalAdapter Schnittstelle instanziiert.

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Console.WriteLine("About to load external adapter...Press <ENTER> to continue."); 
      Console.ReadLine(); 
      LoadAndTestExternalAdapter();    
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
     Console.ReadLine(); 
    } 

    private static void LoadAndTestExternalAdapter() 
    { 
     Interfaces.ISomeExternalAdapter adapter = new ExternalAdapter.TheAdapter() as Interfaces.ISomeExternalAdapter; 
     Console.WriteLine(adapter.GetSomeValue("red")); 
     Console.WriteLine(adapter.GetSomeValues("flavor")); 
    } 
} 

Dieser schlägt mit einem System.IO.FileNotFoundException:

Datei oder Assembly nicht geladen werden konnte 'ExternalAdapter, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. Die angegebene Datei wurde vom System nicht gefunden.

Doch wenn ich in meinem \ bin \ Debug \ netcoreapp2.0 Ordner des Hauptprogramms suchen, wird die ExternalAdapter.dll gefunden.

Wenn ich einen Clean/Rebuild mache, fügt er es pflichtgemäß hinzu, also bin ich mir ziemlich sicher, dass die Datei gefunden werden sollte.

Ist das ein Fehler in 2.0? Oder müssen wir "Interfaced" Adapter anders laden?

Unser eventuelles Projekt hat Dutzende von "Adaptern", die über ihre Schnittstelle geladen werden, abhängig von der Art der Verarbeitung, die wir auf unserem Server ausführen müssen. Dieses kleine Beispiel weist jedoch auf das Problem in unserer Hauptanwendung hin. Jede und alle Hilfe wird geschätzt.

Antwort

0

Das Problem wurde gelöst, indem die "Schnittstellendefinition" in eine eigene Bibliothek verschoben und diese Bibliothek als Referenz in mein ExternalAdapter-Projekt und mein TestExternalInterface-Projekt aufgenommen wurde. Entweder das, ein Update auf 2.0 hat es behoben - ich bin mir nicht sicher. Aber nach einem Monat habe ich das funktioniert. Ein Screenshot des neuen Projektlayouts lautet wie folgt:

New Project Layout

Verwandte Themen