(System.IO.FileNotFoundException).net核心Web API通过“添加引用”添加DLL时找不到子依赖项(依赖项的依赖项)

时间:2019-03-29 12:51:41

标签: asp.net-core .net-core asp.net-core-2.0 asp.net-core-webapi nuget-package

我的.Net Core Web API中出现 System.IO.FileNotFoundException 。因此,我建立了以下项目来演示该问题。

我创建了一个名为 DemoLibrary 的.Net标准库,并通过NuGet添加了 QRCoder 依赖项。

免责声明:选择QRCoder的原因是Web API默认不使用它。我不在项目中使用它。实际上,我在EntityFrameworkCore中遇到了此异常。

我创建了一个没有其他依赖项的新.Net Core Web API DemoWebAPI

然后通过添加引用->浏览-> DemoLibrary.dll将DemoLibrary添加到DemoWebAPI。

这是我的解决方案:

enter image description here

Calculate类中的DemoMethod方法仅创建QRCodeGenerator的对象。

public class Calculate
{
    public static string DemoMethod()
    {
        QRCodeGenerator qrGenerator = new QRCodeGenerator();
        return "";
    }
}

而我在DemoWebAPI中的ValuesController只是调用该方法:

[HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new string[] { "value1", "value2", DemoLibrary.Calculate.DemoMethod()  };
    }

现在,当我运行DemoWebAPI项目时,调用DemoMethod时出现以下异常:

  

System.IO.FileNotFoundException:'无法加载文件或程序集'QRCoder,版本= 1.3.5.0,区域性=中性,PublicKeyToken =空'。系统找不到指定的文件。'

我了解必须将 QRCoder.dll 文件复制到某个地方的事实。但我不知道该放在哪里。我已经尝试将其放在DemoWebAPI的“ bin / debug / netcoreapp2.2” 和DemoLibrary的“ bin / debug / netstandard2.0” 中。 >

但是我无法正常工作。

  

请求:因为我是.Net Core的新手,所以请尽可能以描述性的方式发布您的答案。

修改: 我知道NuGet服务器。我读过一些主题,例如在IIS和Azure中托管NuGet服务器。 DLL参考背后的原因是我想在两个项目中使用我的DLL,其中一个是.net核心API,另一个是NMAKE编译的.net框架类库。我找不到任何方法来还原.MAK文件中的NuGet软件包。

1 个答案:

答案 0 :(得分:0)

似乎您只是将DemoLibrary的DLL添加到了DemoWebApi项目中。那不是应该添加引用的方式。由于这些解决方案在同一解决方案中,因此您应该添加项目参考。这样可以解决您的问题。

现在,让我解释一下这里的实际情况。您的DemoLibrary依赖于QRCoder。这是一个NuGet参考,这意味着该软件包将被还原(即下载)并包含在您的DemoLibrary构建输出中。但是,它将作为您DemoLibrary.dll旁边的一个或多个DLL包含在内。然后,当您仅引用DemoLibrary.dll时,就会丢失DemoLibrary一部分的所有其他这些DLL,因此,事情将无法正常工作。

现在,当涉及到项目参考时,事情要复杂得多。项目引用实际上将引用的项目包装到您的其他项目中。您可以将其视为子项目。出于所有目的和目的,就像子项目的任何依赖都变成了主项目的依赖一样。这意味着DemoWebAPI从技术上讲现在具有对QRCoder的NuGet程序包引用,即使在其项目文件中没有显式的程序包引用也是如此。依赖项来自您的DemoLibary项目。因此,对于项目参考,将包括所有必要的依赖项,因为好像主项目通过子项目本身包括了那些依赖项。

对于它的价值,您实际上应该永远不要直接将DLL作为参考。以前需要这样做,但是NuGet软件包的概念几乎消除了这种做法。即使DemoLibraryDemoWebAPI不在同一个解决方案中(这意味着您不能再进行项目引用),使用它的正确方法是将DemoLibary转换为NuGet包,然后像其他任何NuGet包一样,通过包引用在DemoWebAPI中对其进行引用。您不只是添加DLL。