NuGet软件包(.NET Standard 2.x)打破了ASP.NET MVC5应用程序(.NET完整框架)

DrG*_*iff 7 c# asp.net-mvc nuget .net-standard

(更新-见下文)

我有一个ASP.NET MVC5应用程序(多个程序集),都解决了.NET Full Framework 4.7.1的问题。

我最近添加了一个使用.NET Standard 2构建的(私有)NuGet软件包。从快速入门:使用Visual Studio(.NET Framework)创建和发布一个软件包

除非您有其他选择,否则.NET Standard是NuGet软件包的首选目标,因为它提供了与最广泛使用项目的兼容性。

从那以后,事情就变得不一样了.....下面列出了一系列错误,但是我怀疑它们都是同一问题的征兆(最后讨论)。

请注意:我使用的是Visual Studio 15.7.1,所有NuGet软件包都使用package.config管理格式,而不是PackageReference。

第一个问题

找不到方法:'System.Collections.ObjectModel.Collection`1 System.Web.Http.HttpConfiguration.get_MessageHandlers()'

我的猜测是,有一个.NET Standard版本的System.Web.Http没有此方法,我的应用程序选择了解决此问题,而不是4.7.1框架。

我通过将以下内容添加到我的web.config文件中来部分解决此问题:

<dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="B03F5F7F11D50A3A" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我说“部分地”修复了该问题,这可以在我的DEV环境(使用Visual Studio)中运行时解决此问题,但是当发布到我们的QA环境中时,问题仍然存在。有想法该怎么解决这个吗?

注意:MVC项目对System.Net.Http的引用位于以下路径中(它不是NuGet包):

C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Professional \ MSBuild \ Microsoft \ Microsoft.NET.Build.Extensions \ net471 \ lib \ System.Net.Http.dll

第二个问题 大会中有两个涉及从各种Web来源(WCF,Web-api,Web服务)提取数据。在发布模式下(在我已打开代码分析等的情况下)编译它们时,收到以下错误报告:

试图加载格式错误的程序集:C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.7.1 \ Facades \ System.IO.Compression.ZipFile.dll。{程序集的名称} {程序集的路径} \ SGEN

我发现一个帖子有以下建议:

我看到的另一个建议(完全没有帮助)是禁止项目创建序列化程序集。请按照以下步骤进行操作(可能有帮助也可能没有帮助,但值得尝试):

  1. 在解决方案资源管理器中,右键单击出现错误的项目,然后转到“属性”。
  2. 在“构建”选项卡中,滚动到最底部,然后将“生成序列化程序集”更改为“关”

我尝试过,是的,它对我有用。但是,这是两个要序列化对象以发送到各种Web资源的项目,所以我最后要做的就是取消应用程序中的序列化优化。

关于什么可能是错的或我最好如何进行的任何建议?

更新2018年5月14日, 我发现Scot Hanselman撰写了一篇有关NuGet软件包的精彩文章,其中指出:

正如Oren明智地说的:

“使用.NET Standard要求您使用PackageReference来消除“很多程序包”的痛苦,并正确处理传递依赖关系。尽管您可以在没有PackageReference的情况下使用.NET Standard,但我不建议这样做。

但是,有一个问题。...在Visual Studio中,现在有一种简便的方法可以将程序集从较早的package.config迁移到PackageReference,如该链接中所述,但该文章明确指出:

请注意,迁移器目前不支持C ++,JavaScript和ASP.NET(.NET Framework)项目。

尝试这样做时,迁移工具及时通知我,对于NuGet包Microsoft.AspNet.Mvc和Microsoft.AspNet.WebPages:

迁移后安装软件包时,“内容”资产不可用

更新2018年5月23日,我发现其他几个人也遇到了类似的问题。来自GitHub:使用SGen构建的.NET 4.6.1 / .NET Standard 2.0失败#1630。他们的“解决方案”再次是禁用序列化(请参见上文),这会破坏我的应用程序的性能。

<GenerateSerializationAssemblies>关闭</ GenerateSerializationAssemblies>

结论?

因此,我是否可以得出结论,要在.NET FullFramework应用程序中使用.NET Standard 2.x NuGet包,我需要使用PackageReference而不是package.config,并且这在AspNet.MVC应用程序中目前无法实现?换句话说,目前不可能。

ole*_*ksa 1

我遇到了 .Net Framework 4.8 应用程序和System.Buffers程序集格式不正确的问题

MarkKharitonov的建议解决了这个错误。使用Directory.Build.targets文件我可以毫无问题地构建一个项目。

<Project>
  <ItemGroup>
    <ReflectionOnlyAssemblyNames Include="Microsoft.Bcl.AsyncInterfaces"/>
    <ReflectionOnlyAssemblyNames Include="System.Buffers"/>
    <ReflectionOnlyAssemblyNames Include="System.Numerics.Vectors"/>
    <ReflectionOnlyAssemblyNames Include="System.Runtime.CompilerServices.Unsafe"/>
  </ItemGroup>
  <Target Name="RemoveDesignTimeFacadesBeforeSGen" BeforeTargets="GenerateSerializationAssemblies">
    <ItemGroup>
      <_ReflectionOnlyAssembly_Names Include="@(_ReferencePath_Names)"
                                     Condition="'@(ReflectionOnlyAssemblyNames)' == '@(_ReferencePath_Names)' And '%(Identity)' != ''"/>
    </ItemGroup>
    <ItemGroup>
      <ReferencePath Remove="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
      <ReferencePath Remove="@(_ReflectionOnlyAssembly_Names->'%(OriginalIdentity)')" />
    </ItemGroup>
    <Message Importance="normal" Text="Removing DesignTimeFacades from ReferencePath before running SGen." />
  </Target>
  <Target Name="ReAddDesignTimeFacadesBeforeSGen" AfterTargets="GenerateSerializationAssemblies">
    <ItemGroup>
      <ReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" />
      <ReferencePath Include="@(_ReflectionOnlyAssembly_Names->'%(OriginalIdentity)')" />
    </ItemGroup>
    <Message Importance="normal" Text="Adding back DesignTimeFacades from ReferencePath now that SGen has run." />
  </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)