我的.Net Core Web API中出现 System.IO.FileNotFoundException 。因此,我建立了以下项目来演示该问题。
我创建了一个名为 DemoLibrary 的.Net标准库,并通过NuGet添加了 QRCoder 依赖项。
免责声明:选择QRCoder的原因是Web API默认不使用它。我不在项目中使用它。实际上,我在EntityFrameworkCore中遇到了此异常。
我创建了一个没有其他依赖项的新.Net Core Web API DemoWebAPI 。
然后通过添加引用->浏览-> DemoLibrary.dll将DemoLibrary添加到DemoWebAPI。
这是我的解决方案:
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软件包。
答案 0 :(得分:0)
似乎您只是将DemoLibrary
的DLL添加到了DemoWebApi
项目中。那不是应该添加引用的方式。由于这些解决方案在同一解决方案中,因此您应该添加项目参考。这样可以解决您的问题。
现在,让我解释一下这里的实际情况。您的DemoLibrary
依赖于QRCoder
。这是一个NuGet参考,这意味着该软件包将被还原(即下载)并包含在您的DemoLibrary
构建输出中。但是,它将作为您DemoLibrary.dll
旁边的一个或多个DLL包含在内。然后,当您仅引用DemoLibrary.dll
时,就会丢失DemoLibrary
一部分的所有其他这些DLL,因此,事情将无法正常工作。
现在,当涉及到项目参考时,事情要复杂得多。项目引用实际上将引用的项目包装到您的其他项目中。您可以将其视为子项目。出于所有目的和目的,就像子项目的任何依赖都变成了主项目的依赖一样。这意味着DemoWebAPI
从技术上讲现在具有对QRCoder
的NuGet程序包引用,即使在其项目文件中没有显式的程序包引用也是如此。依赖项来自您的DemoLibary
项目。因此,对于项目参考,将包括所有必要的依赖项,因为好像主项目通过子项目本身包括了那些依赖项。
对于它的价值,您实际上应该永远不要直接将DLL作为参考。以前需要这样做,但是NuGet软件包的概念几乎消除了这种做法。即使DemoLibrary
与DemoWebAPI
不在同一个解决方案中(这意味着您不能再进行项目引用),使用它的正确方法是将DemoLibary
转换为NuGet包,然后像其他任何NuGet包一样,通过包引用在DemoWebAPI
中对其进行引用。您不只是添加DLL。