【发布时间】:2019-11-03 23:28:23
【问题描述】:
我有一个包含 3 个项目的 Visual Studio 解决方案。
顶层是 .NET Framework 4.6.1 控制台应用程序(项目 A)。 它依赖于 .NET Framework 4.6.1 类库(项目 B)。 项目 B 依赖于 .NET Standard 2.0 类库(项目 C)。
我在项目 C 中有一些代码使用 System.Data.SqlClient(NuGet 包版本 4.6.1)。
由于以下已知问题https://github.com/dotnet/sdk/issues/901,我还将 System.Data.SqlClient 作为 NuGet 依赖项添加到项目 B(.NET Framework 类库)。
这是场景一,在构建解决方案时,System.Data.SqlClient被复制到项目A的/bin/Debug文件夹下,应用程序运行成功。
场景一的代码在这里https://github.com/JamesDunlop/TestDependencyFlowsNetStandard
但是,对于场景 2,我现在添加了对项目 A 的项目引用,这样它现在也直接引用/依赖于项目 C(即 .NET 标准类库)以及项目 B。这模仿了什么我需要在旧版应用程序中执行此操作。
清理、重建和运行。项目 A 的 /bin/Debug 文件夹中现在缺少 System.Data.SqlClient,并且在运行时出现异常“System.IO.FileNotFoundException: 'Could not load file or assembly 'System.Data.SqlClient”
为什么 System.Data.SqlClient 没有被复制到 /bin/Debug ?
请注意,我选择不将 .NET Framework 项目迁移到 PackageReferences 以解决问题 https://github.com/dotnet/sdk/issues/901,因为我需要在不可行的大型旧版 ASP.NET 解决方案中实现这一点。
我希望添加对项目 C 的引用不会产生什么影响,除了(如观察到的那样)它会导致更多的类型转发 DLL 被复制到 /bin/Debug 文件夹。但我不希望 System.Data.SqlClient 现在丢失。
【问题讨论】:
-
"2 此处列出的版本代表 NuGet 用于确定给定 .NET Standard 库是否适用的规则。虽然 NuGet 认为 .NET Framework 4.6.1 支持 .NET Standard 1.5 到 2.0,但使用为 .NET Framework 4.6.1 项目的这些版本构建的 .NET Standard 库存在几个问题。对于需要使用此类库的 .NET Framework 项目,我们建议您将项目升级到面向 .NET Framework 4.7 .2 或更高。” (docs.microsoft.com/en-us/dotnet/standard/net-standard)。也许有一些绳子可以拉上
-
感谢@Sinaesthetic 的建议。我已经尝试将 .NET Framework 项目升级到 4.7.2,但不幸的是,上述问题仍然存在。
-
将
System.Data.SqlClientNuGet 包也添加到项目 A 应该可以解决它。对于场景 2,MSBuild日志显示它尝试从项目C中解决此依赖关系,因为.NET Standard项目不会将其依赖关系复制到bin文件夹中,所以该项目在此处丢失。对于场景 1,MSBuild从项目 B 中解析,成功。
标签: c# .net dll .net-standard dll-reference