我有以下两个项目:

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

DataLoaderLib使用System.Web.Services,我知道这在.NET Core中不可用. (最初此项目位于.NET框架中,但我将其移至.NET标准版,以便可以在我的.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框架的库转移到.NET标准项目,我可以使用它们.

我做错了什么?

推荐答案

我的理解是,如果.NET框架的库转移到.NET标准项目,我可以使用它们.

不,事实并非如此--.NET标准只是一组API筛选器/定义,提供expected个,并在实现该.NET标准的任何运行时上可用.如果您的库仅限于.NET Standard 2.0 API,那么它should可以在.NET Core 3.1或更高版本、.NET Framework4.6.2或更高版本(IIRC)以及任何其他.NET Standard 2实现(可能是Unity)上工作.

然而,在引用.NET框架特定库的那一刻:所有的赌注都落空了.该库可能试图调用.NET Core上的其他框架位that don't exist(或已移动等),或者可能试图通过特定Windows运行时之外的API don't exist访问操作系统功能.如果在.NET框架上运行,您所描述的设置将会工作probably,原因很简单,因为运行时的一切都将就绪--但是:在任何其他运行时:掷骰子.

我做错了什么?

从面向.NET标准的项目引用.NET框架特定的程序集.您必须将自己限制在themselves面向.NET标准的库.在现实中,以.NET标准为目标被高估了;在我看来,多目标runtimes通常更有用、更实用,例如,您可以多目标.NET框架的某个版本(S)和.NET Core/更高版本,并使用correct and known实现,而不是.NET标准API.

Csharp相关问答推荐

在包含空项的列表上使用具有断言T的摘要表

向类注入一个工厂来创建一些资源是一个好的实践吗?

如何在NServicebus中配置学习传输的文件夹(NService bus 8)

Entity Framework Core 8 dbcontext—无法以多对多关系添加某些行'

UWP中的任务和界面

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

为基本审计设置Audit.EntityFramework.Core

为什么我可以用硬编码的集合而不是变量来设置没有setter的IList属性的值?

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

在被Interactive Server切换后,Blazor SSR页面无法正确加载JS

具有类型识别的泛型方法

在使用UserManager时,如何包含与其他实体的关系?

.NET 8在appsettings.json中核心使用词典URI、URI&>

如何返回具有泛型的类?

如何使用Npgsql从SELECT获得所有查询结果

用于ASP.NET核心的最小扩展坞

用于请求用户返回列表的C#Google API

Visual Studio 17.8.0制表符自动完成问题--三缩进

WPF如何获取有关从一个视图模型更改另一个视图模型的信息

如何更改Datagridview行标题