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
我发现一个帖子有以下建议:
我看到的另一个建议(完全没有帮助)是禁止项目创建序列化程序集。请按照以下步骤进行操作(可能有帮助也可能没有帮助,但值得尝试):
- 在解决方案资源管理器中,右键单击出现错误的项目,然后转到“属性”。
- 在“构建”选项卡中,滚动到最底部,然后将“生成序列化程序集”更改为“关”
我尝试过,是的,它对我有用。但是,这是两个要序列化对象以发送到各种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应用程序中目前无法实现?换句话说,目前不可能。
我遇到了 .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)