我有以下两个项目:
ConsoleApp (.Net Core 3.1)
DataLoaderLib (.Net Standard 2.1)
字符串
DataLoaderLib使用System.Web.Services,我知道这在. NETCore中不可用。(最初这个项目是在.NET Framework中,但我将其移动到.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 Framework中的库,如果它们移动到.NET标准项目。
我做错了什么?
1条答案
按热度按时间efzxgjgh1#
我的理解是,我可以使用.NET Framework中的库,如果它们移动到.NET标准项目。
不;事实并非如此- .NET标准只是一组API过滤器/定义,* 预期 * 将在实现该.NET标准的任何运行时上提供和可用。如果你的库仅限于.NET Standard 2.0 API,那么它应该在.NET Core 3.1或更高版本、.NET Framework 4.6.2或更高版本(IIRC)以及任何其他.NET Standard 2实现(可能是Unity)上运行。
但是,当您引用.NET Framework特定的库时:一切都完了该库可能试图调用.NET Core上不存在的其他框架位 *(或已移动等),或者可能试图通过特定Windows运行时之外 * 不存在 * 的API访问操作系统功能。如果你在.NET Framework上运行,你所描述的设置可能会工作,仅仅是因为运行时的一切都将就位-但是:在任何其他运行时:掷骰子
我做错了什么?
从面向. NETStandard的项目中引用特定于. NETFramework的程序集。您必须限制自己使用本身针对.NET标准的库。事实上,瞄准.NET标准是高估了;在我看来,多目标 * 运行时 * 通常更有用和实用,例如,您可以多目标某些版本的.NET Framework和.NET Core /更新版本,并使用 * 正确和已知 * 实现,而不是.NET标准API。