c# - .NET Standard 2.1 与 .NET Core 3.1 无法加载文件或程序集

标签 c# .net visual-studio .net-core .net-standard

我有以下 2 个项目:

ConsoleApp (.Net Core 3.1)
DataLoaderLib (.Net Standard 2.1)

DataLoaderLib 使用 System.Web.Services,我知道它在 .NET Core 中不可用。 (最初这个项目位于 .NET Framework 中,但我将其移至 .NET Standard,以便我可以在我的 .NET Core 项目中引用它。)

所以...ConsoleApp引用DataLoaderLib,而DataLoaderLib引用System.Web.Services。

但是,当我运行 ConsoleApp 时,我收到以下错误消息。

Could not load file or assembly 'System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Reference assemblies should not be loaded for execution.  They can only be loaded in the Reflection-only loader context. (0x80131058)'

我可以在输出目录中看到System.Web.Services.dll,所以我不认为它找不到该文件。

我的理解是,如果 .NET Framework 中的库转移到 .NET Standard 项目,我可以使用它们。

我做错了什么?

最佳答案

My understanding was that I could use libraries from .NET Framework if they moved to a .NET Standard project.

不;事实并非如此 - .NET Standard 只是一组 API 过滤器/定义,预期将在实现该 .NET Standard 的任何运行时提供和可用。如果您的库仅限于 .NET Standard 2.0 API,那么它应该可以在 .NET Core 3.1 或更高版本、.NET Framework 4.6.2 或更高版本 (IIRC) 以及任何其他 .NET 上运行标准 2 实现(也许是 Unity)。

但是,当您引用 .NET Framework 特定库时:所有的赌注都消失了。该库可能会尝试调用 .NET Core 上不存在的其他框架位(或已移动等),或者可能会尝试通过 API 访问不存在的操作系统功能不存在于特定的 Windows 运行时之外。如果您在 .NET Framework 上运行,您描述的设置可能会起作用,因为运行时的所有内容都会就位 - 但是:在任何其他运行时:掷骰子。

What am I doing wrong?

从面向 .NET Standard 的项目引用 .NET Framework 特定程序集。您必须限制自己使用本身针对.NET Standard 的库。事实上,针对 .NET Standard 的评价被高估了。在我看来,多目标运行时通常更有用和务实,例如,您可以多目标 .NET Framework 和 .NET Core 的某些版本/更高版本,并使用 正确且已知的实现,而不是 .NET 标准 API。

关于c# - .NET Standard 2.1 与 .NET Core 3.1 无法加载文件或程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76740116/

相关文章:

c# - 简单的词法解析器

.net - 如何使用 ILMerge 将多个程序集合并为一个程序集

c# - 添加 Reporting.WinForms 对 VS2015 的引用

c# - 我可以将 html 或 css 类添加到 @Html.DropDownListFor 元素吗

c# - 如何配置 ASP.NET 应用程序的环境?

c# - X509Certificate.CreateFromCertFile - 指定的网络密码不正确

c# - .NET 核心 2.1 和 EF 框架 2.1

.net - .NET 3.5 SP1对于WCF/REST有多重要?

visual-studio - 使用 VS2015 和 Trend Micro 杀毒软件进行慢速调试

c++ - 将引用作为命名参数传递给可变参数函数时出现问题