【问题标题】:(System.IO.FileNotFoundException) .Net core Web API cannot find child dependency (Dependencies of dependency) when added DLL by "Add Reference"(System.IO.FileNotFoundException).Net核心Web API在通过“添加引用”添加DLL时找不到子依赖项(依赖项)
【发布时间】:2019-08-20 10:02:57
【问题描述】:

我的 .Net Core Web API 中出现 System.IO.FileNotFoundException。所以我设置了下面的项目来演示这个问题。

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

免责声明:选择 QRCoder 的原因是 Web API 默认不使用它。我不在我的项目中使用它。事实上,我得到了 EntityFrameworkCore 的这个例外。

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

然后通过 Add Reference -> Browse -> 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 = null'。系统找不到指定的文件。'

我明白我必须将 QRCoder.dll 文件复制到某处。但我不明白该放在哪里。我已经尝试将其放入 DemoWebAPI 的 "bin/debug/netcoreapp2.2" 和 DemoLibrary 的 "bin/debug/netstandard2.0" 中。 p>

但我无法让它工作。

请求:请尽可能详细地发布您的答案,因为我是 .Net Core 的新手。

编辑: 我知道 NuGet 服务器。我已经阅读了诸如在 IIS 和 Azure 中托管 NuGet 服务器之类的主题。 DLL 引用背后的原因是我想在两个项目中使用我的 DLL,其中一个是 .net 核心 API,另一个是由 NMAKE 编译的 .net 框架类库。我找不到任何方法来恢复 .MAK 文件中的 NuGet 包。

【问题讨论】:

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


    【解决方案1】:

    您似乎只是将DemoLibrary 的DLL 添加到您的DemoWebApi 项目中。这不是你应该添加引用的方式。由于这些在同一个解决方案中,您应该添加一个项目引用。这将解决您的问题。

    现在,让我解释一下这里实际发生了什么。您的 DemoLibrary 依赖于 QRCoder。这是一个 NuGet 参考,这意味着该包将被恢复(即下载)并包含在您的 DemoLibrary 构建输出中。但是,它将作为一个或多个 DLL 包含在您的 DemoLibrary.dll 旁边。然后,当您仅引用 DemoLibrary.dll 时,您将丢失所有这些属于 DemoLibrary 的其他 DLL,因此无法正常工作。

    现在,当涉及到项目参考时,事情就稍微复杂了一点。项目引用实质上是将引用的项目包装到您的其他项目中。您可以将其视为子项目。出于所有意图和目的,就像子项目的任何依赖项都成为主项目的依赖项一样。这意味着 DemoWebAPI 现在在技术上具有对 QRCoder 的 NuGet 包引用,即使其项目文件中没有明确的包引用。依赖项来自您的 DemoLibary 项目。因此,通过项目引用,将包含所有必要的依赖项,因为就好像主项目通过子项目包含那些本身一样。

    对于它的价值,你几乎不应该直接包含一个 DLL 作为参考。这曾经是必需的,但 NuGet 包的概念几乎消除了这种做法。即使DemoLibraryDemoWebAPI不在同一个解决方案中(意味着你不能再做项目引用),正确的使用方法是将DemoLibary变成一个NuGet包,然后在DemoWebAPI 通过包引用,就像任何其他 NuGet 包一样。您不是简单地添加 DLL。

    【讨论】:

    • 我知道项目引用。我将此项目设置为演示目的。实际上,我想引用 DLL。 NuGet 服务器将是我最后的选择。你的意思是说不可能吗?
    • 您可以设置自己的私有 NuGet 存储库。如果你想托管 Azure DevOps,最多可免费为 5 名开发人员提供一个。您还可以在本地或共享网络位置引用 NuGet。
    • 这是否意味着无法使用 dll 引用?
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2019-08-06
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多