我有以下 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/