我们有一个高度依赖“适配器”的系统,该适配器实现了用于进行唯一处理的简单接口。通常,我们通过程序集名称动态加载它们,但是在这种情况下,我们只想从解决方案中将它们作为“库”加载。在dotnet Core 2.0中,这似乎已被打破。我包括一个显示此问题的小样本。也许我的设计有缺陷,或者某些变化。在dotnet Framework(Core之前)中,这种相同的模式对我们来说运作良好。

我包括一个示例和示例项目的屏幕快照,但这只是它的精髓。

c# - dotnet core 2.0中的库获取FileNotFound异常-LMLPHP

我有一个名为ExternalAdapter的dotnet核心2.0“库”。

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


它内有一个名为TheAdapter的类,该类实现ISomeExternalAdapter接口。

我有一个dotnet core 2.0“控制台应用程序”,它将一个新的ExternalAdapter.TheAdapter()实例化为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"));
    }
}


这将失败,并出现System.IO.FileNotFoundException:


  无法加载文件或程序集“ ExternalAdapter,版本= 1.0.0.0,区域性=中性,PublicKeyToken =空”。该系统找不到指定的文件。


但是,当我查看主程序的\ bin \ Debug \ netcoreapp2.0文件夹时,便找到了ExternalAdapter.dll。

如果我执行清理/重建操作,它也会尽职地将其放置在此处,因此,我很确定应该找到该文件。

这是2.0版的错误吗?还是我们需要以其他方式加载“接口”适配器?

我们最终的项目有数十个“适配器”,将根据它们在服务器上需要执行的处理类型通过它们的接口加载,但是这个小例子指出了我们主应用程序中存在的问题。
任何和所有帮助表示赞赏。

最佳答案

通过将“接口定义”移到其自己的库中并包括该库作为我的ExternalAdapter项目和TestExternalInterface项目中的引用,该问题已得到解决。要么,对2.0的更新已修复它-我不确定。但是一个月后,我开始工作了。新项目布局的屏幕截图如下:

c# - dotnet core 2.0中的库获取FileNotFound异常-LMLPHP

09-28 01:42