【问题标题】:FileNotFoundException when referencing DLL in .NET Core Application在 .NET Core 应用程序中引用 DLL 时出现 FileNotFoundException
【发布时间】:2017-10-25 21:01:12
【问题描述】:

我有一个 .NET Core 控制台应用程序和一个 .NET Core 类库。两者都是非常简单的单类项目。两者都是全新构建的,全新安装了最新的 .NET Core。两者都针对 .NET Core 1.1。

每当我在应用程序中包含 .NET Core 类库时,都会在运行时发生此错误:

System.IO.FileNotFoundException: '无法加载文件或程序集 '名称,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'。这 系统找不到指定的文件。

构建任何一个项目都很好,Intellisense 在包含using... 语句后会向我显示类库的内容。参考和编写的代码在编译时没有问题。

我已在我的控制台应用程序中为引用的程序集将 Copy Local 设置为 Yes。引用的 DLL 在运行时存在于控制台应用程序的 bin 文件夹中。

这是csproj 参考:

<Reference Include="NAME">
  <HintPath>path\bin\Debug\netcoreapp1.1\NAME.dll</HintPath>
  <Private>true</Private>
  <SpecificVersion>false</SpecificVersion>
</Reference>

这只发生在 .NET Core DLL 中,我对 .NET Framework 4.5.* 及更高版本完全没有问题。

有人能解释一下这个问题吗?我发现的任何与此相关的 SO/MSDN 页面都是特定问题,例如针对 DLL 的不正确版本,这无济于事。

【问题讨论】:

标签: c# .net-core


【解决方案1】:

不支持使用 2.0 之前的工具在 .NET Core 应用程序中引用 DLL 文件。

原因是依赖图(deps.json 文件)生成不包括这些文件,并且很可能无论如何都无法工作,因为它无论如何都无法合并引用的 DLL 的引用/依赖关系。

对于即将发布的 2.0 版本,只要您还引用了原始包正在使用的所有 DLL/包,该方案就应该可以工作。语法是:

<Reference Include="path/to/my.dll" />

.NET Core 2.0 还将支持以这种方式引用已为 .NET 4.6.1 构建的程序集,但如果 DLL 使用不受支持的 API 调用,它可能会在运行时失败。

【讨论】:

  • 我实际上也遇到了 .net core 2.0 的问题。只有 asp.net 项目,控制台项目可以正常工作。
  • 我在 aspnet core 2.0 项目中也面临同样的问题。有人对此有解决方案吗?
  • @KiranR 我已通过从本地文件夹安装 nuget 包修复它
  • 感谢您提及 deps.json 文件。它帮助我调试了一些“手动部署”问题
【解决方案2】:

经过大量挖掘,我找到了适合我的 .NET Core 2.0 解决方案。

核心问题:我通过 Visual Studio 2017 添加了项目引用。在我的 Web 应用程序中,我引用了两个 .NET Core 库;虽然一切都在编译,但在运行时,我得到一个指向两个 DLL 之一的 FileNotFound 异常。

对我有用的解决方案:

  • 关闭 Visual Studio
  • 打开带有引用的.csproj。删除对项目的引用。
  • 从终端,cd 进入项目文件夹并手动添加引用,使用 dotnet add reference ..\..\foo\bar.csproj
  • 启动 Visual Studio,构建并运行您的(Web)应用程序

对我来说,这解决了问题。

【讨论】:

  • 这是以与接受的答案相同的方式添加引用,只是通过命令行。不过应该以同样的方式工作。
  • 我同意这听起来一样。我也可以证明,至少在我的情况下,是有区别的;通过 Visual Studio 添加会在运行时产生错误,而通过 dotnet 添加不会。我没有签入第一个版本,所以我不确定.csproj 的区别是什么,但我真的很想亲眼看看。
  • 另外,还是有区别的;也许是 .NET Core 2.1,但标签是 ProjectReference,而不是 Reference
  • 奇怪的是那些会如此不同步。不过感谢您的参考,我相信其他人会用这个解决他们的问题。
  • 我希望如此。这个问题非常难以解决,interwebz 上没有太多关于它的其他信息。感谢您的评论/讨论顺便说一句。
【解决方案3】:

不确定这是否算作修复,但至少是一种解决方法。

我只是简单地将类库项目添加到控制台应用程序中,而不是引用 DLL,而是在控制台应用程序中包含对类库项目的依赖项引用并清理/重建。工作正常。

显然,这不是对专有 DLL 的修复,但它可能会有所帮助。

【讨论】:

  • 我不明白,你做了什么?请说清楚。对于我的小型 C# 项目,我没有使用 Visual Studio,我更喜欢 CLI。
  • 我不确定是否使用 CLI,但我没有在 Visual Studio 中单击 Add -&gt; Reference,而是将 DLL 作为新项目附加为整体解决方案的一部分。
猜你喜欢
  • 1970-01-01
  • 2019-04-16
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多