dotnet core 2.0 中的库获取 FileNotFound 异常
Libraries in dotnet core 2.0 get FileNotFound exception
我们有一个严重依赖 "Adapters" 的系统,它实现了一个简单的接口来进行独特的处理。通常,我们通过程序集名称动态加载它们,但在这种情况下,我们只想从我们的解决方案中将它们加载为 "Libraries"。在 dotnet Core 2.0 中,这似乎被打破了。我包括一个展示这个问题的小样本。也许我的设计有缺陷,或者发生了某些变化。同样的模式在 dotnet Framework(Core 之前)中对我们很有效。
我提供了一个示例和我的示例项目的屏幕截图,但这就是它的要点。
我有一个名为 ExternalAdapter 的 dotnet core 2.0 "library"。
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 的 class 实现了 ISomeExternalAdapter 接口。
我有一个 dotnet 核心 2.0 "console app",它实例化了一个新的 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:
Could not load file or assembly 'ExternalAdapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
然而,当我查看主程序的 \bin\Debug\netcoreapp2.0 文件夹时,发现了 ExternalAdapter.dll。
如果我进行清理/重建,它也会尽职尽责地把它放在那里,所以我很确定应该找到该文件。
这是 2.0 中的错误吗?还是我们需要以不同的方式加载 "Interfaced" 适配器?
我们最终的项目有几十个 "adapters" 将根据我们需要在服务器上执行的处理类型通过它们的接口加载,但是这个小例子指出了我们在我们的主要应用程序。
感谢您提供任何帮助。
问题已通过将 "Interface Definition" 移动到它自己的库并将该库作为我的 ExternalAdapter 项目和 TestExternalInterface 项目中的引用而解决。或者,2.0 的更新已修复它 - 我不确定。但是一个月后,我开始工作了。新项目布局截图如下:
我们有一个严重依赖 "Adapters" 的系统,它实现了一个简单的接口来进行独特的处理。通常,我们通过程序集名称动态加载它们,但在这种情况下,我们只想从我们的解决方案中将它们加载为 "Libraries"。在 dotnet Core 2.0 中,这似乎被打破了。我包括一个展示这个问题的小样本。也许我的设计有缺陷,或者发生了某些变化。同样的模式在 dotnet Framework(Core 之前)中对我们很有效。
我提供了一个示例和我的示例项目的屏幕截图,但这就是它的要点。
我有一个名为 ExternalAdapter 的 dotnet core 2.0 "library"。
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 的 class 实现了 ISomeExternalAdapter 接口。
我有一个 dotnet 核心 2.0 "console app",它实例化了一个新的 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:
Could not load file or assembly 'ExternalAdapter, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.
然而,当我查看主程序的 \bin\Debug\netcoreapp2.0 文件夹时,发现了 ExternalAdapter.dll。
如果我进行清理/重建,它也会尽职尽责地把它放在那里,所以我很确定应该找到该文件。
这是 2.0 中的错误吗?还是我们需要以不同的方式加载 "Interfaced" 适配器?
我们最终的项目有几十个 "adapters" 将根据我们需要在服务器上执行的处理类型通过它们的接口加载,但是这个小例子指出了我们在我们的主要应用程序。 感谢您提供任何帮助。
问题已通过将 "Interface Definition" 移动到它自己的库并将该库作为我的 ExternalAdapter 项目和 TestExternalInterface 项目中的引用而解决。或者,2.0 的更新已修复它 - 我不确定。但是一个月后,我开始工作了。新项目布局截图如下: