【发布时间】:2019-02-08 16:19:38
【问题描述】:
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有许多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework 应用程序,并且在运行时出现 Could not load file or assembly 错误:
存在许多来源,如下面的来源,表明可以通过添加对网络框架项目的缺失依赖项来解决此问题:
然而,这是不利的,因为我不希望项目必须携带他们不应该要求的直接引用;依赖项应该自然流动,以便将来添加/删除的依赖项正常工作。
其他来源表示可以通过在网络项目文件中添加<RestoreProjectStyle>PackageReference</RestoreProjectStyle>和<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>来解决:
- https://stackoverflow.com/a/53654690/2704659
- https://stackoverflow.com/a/53732075/2704659
- https://www.hanselman.com/blog/ReferencingNETStandardAssembliesFromBothNETCoreAndNETFramework.aspx
我已经使用位于同一 Visual Studio 解决方案中的项目测试了上述两个修复程序并取得了成功,但我更喜欢第二种方法,因为它是一个“设置后忘记它”的解决方案.
我发现的问题是当我尝试从网络框架项目中引用网络标准类库时在另一个 VS 解决方案中,我在后一个项目中使用了<RestoreProjectStyle>PackageReference</RestoreProjectStyle> 和 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>approach .在我的具体情况下,我有一个 .NET Framework 可执行项目,它在同一个解决方案中引用了一个 .NET Framework 类库,而该类库在另一个解决方案中引用了一个 .NET Standard 类库。
我创建了an MCVE on GitHub that demonstrates this behavior。我正在使用 VS 2017 v15.9.4。
除了总是直接在网络项目中添加包之外,有没有办法让它工作?
(注意:听起来和这里的问题类似,但我没有使用“点击一次”:https://stackoverflow.com/a/47839628/2704659)
【问题讨论】:
-
您违反了 .NET Standard 类库的基本规则,不应使用任何 Windows 特定的依赖项(除非它确实必须这样做)。仅当应用程序的启动器是 .NET Core 控制台时才应使用 Windows 兼容包(例如与注册表相关),但在您的情况下,它是 .NET Framework 控制台。请将所有注册表操作移到您的 .NET Framework 项目中,然后一切都会完美无缺。
-
@LexLi -- .NET Framework 的情况是一些我们不打算重构的现有客户端程序集(除了用他们一直以来的新的 .NET Standard 版本的库重新编译)引用为 .NET Framework)。换句话说,我正在将一个库从 net472 转换为 netstandard2.0。原因是因为我正在创建一个 ASP.NET Core Web 服务,它公开了类库中的一些功能,我宁愿保持代码库向前发展(即 .net 标准)而不是利用 .NET Framework shims。
-
在发布之前,我确实在这个问题上工作了整整 2 天。现在,我比以往任何时候都更想知道为什么我被否决了。
-
如果您在 app.config 中添加类似的内容(适应版本和路径)
<runtime><assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /><codeBase version="4.1.1.0" href="C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.win32.registry\4.5.0\lib\net461\Microsoft.Win32.Registry.dll"/></dependentAssembly></assemblyBinding></runtime>,或者挂钩AppDomain.CurrentDomainAssemblyResolve事件(未经测试),您可以让它工作而无需任何代码更改 -
@rory.ap 我猜投反对票是由于您设置的人为限制,它们以您自己的方式存在。 netstandard 的理念是成为一个干净的被广泛采用的功能子集,因此它应该只依赖于其他标准库。
标签: c# .net visual-studio visual-studio-2017 .net-standard