2017-08-31 1 views
3

Nous avons un système qui repose fortement sur des "adaptateurs" qui implémentent une interface simple pour faire le traitement unique. Normalement, nous les chargeons dynamiquement par nom d'assembly, mais dans ce cas, nous voulons simplement les charger en tant que "Bibliothèques" à partir de notre solution. Dans Dotnet Core 2.0, cela semble être cassé. J'inclus un petit échantillon qui présente ce problème. Peut-être mon design est défectueux, ou quelque chose a changé. Ce même schéma fonctionne bien pour nous dans dotnet Framework (avant Core).Les bibliothèques dans le noyau de dotnet 2.0 obtiennent l'exception de FileNotFound

J'inclus un exemple et une capture d'écran de ce à quoi ressemble mon projet d'exemple, mais c'est le brouillon de celui-ci.

Solution Folder Layout

J'ai une "bibliothèque" de base dotnet 2.0 appelé 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" }; 
     } 
    } 
} 

Il possède une classe nommée TheAdapter qui implémente l'interface ISomeExternalAdapter.

J'ai un "application console" dotnet core 2.0 qui instancie un nouveau ExternalAdapter.TheAdapter() comme interface ISomeExternalAdapter.

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")); 
    } 
} 

Cela échoue avec un System.IO.FileNotFoundException:

Impossible de charger le fichier ou l'assembly 'ExternalAdapter, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'. Le système ne peut pas trouver le fichier spécifié.

Pourtant, quand je regarde dans mon dossier \ bin \ Debug \ netcoreapp2.0 du programme principal, le ExternalAdapter.dll est trouvé.

Si je fais un nettoyage/reconstruction, il met consciencieusement là aussi, donc je suis sûr que le fichier devrait être trouvé.

Est-ce un bug dans la version 2.0? ou avons-nous besoin de charger les adaptateurs "Interfaced" d'une manière différente? Notre projet éventuel a des dizaines de "adaptateurs" qui seront chargés via leur interface en fonction du type de traitement que nous devons faire sur notre serveur, mais ce petit exemple souligne le problème que nous avons dans notre application principale. Toute aide est appréciée.

Répondre

0

Le problème a été résolu en déplaçant la "Définition d'interface" dans sa propre bibliothèque et en incluant cette bibliothèque comme référence dans mon projet ExternalAdapter et mon projet TestExternalInterface. Soit cela, une mise à jour à 2.0 l'a fixé - je ne suis pas sûr. Mais après un mois, j'ai ce travail. Une capture d'écran de la nouvelle disposition du projet est la suivante:

New Project Layout