【问题标题】:BinaryFormatter not supported in .net 5 app when loading Bitmap resource加载位图资源时,.net 5 应用程序不支持 BinaryFormatter
【发布时间】:2023-03-08 15:10:01
【问题描述】:

我已将几个 ASP.Net Core 2.2 项目迁移到 .Net 5,我遇到的最后一个问题是尝试从项目资源加载位图时出现 System.NotSupported 异常。

RtfUtility.AppendLogo(result, Properties.Resources.Logo);

System.NotSupportedException H结果=0x80131515 Message=BinaryFormatter 序列化和反序列化在此应用程序中被禁用。请参阅https://aka.ms/binaryformatter 了解更多信息。 Source=System.Runtime.Serialization.Formatters

我没有明确使用 BinaryFormatter,但奇怪的是,我在以相同方式加载二进制 PDF 文件时没有收到错误:

processor.LoadDocument(new MemoryStream(Properties.Resources.Certificate));

这两种机制都使用 ResourceManager.GetObject,所以我不确定发生了什么。我知道我可以关闭项目文件中的错误,但这似乎是一个短期解决方案,我宁愿修复它并忘记它。感谢您提供的任何建议...

编辑:

堆栈跟踪如下,错误不是库引起的,是访问资源时引起的。它在图像被嵌入或链接时发生 - 似乎没有区别,但不会发生在(二进制)PDF文件中。

感谢您查看此内容...

在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream) 在 System.Resources.ResourceReader.c__DisplayClass7_0`1.b__0(对象 obj,流流) 在 System.Resources.ResourceReader.DeserializeObject(Int32 typeIndex) 在 System.Resources.ResourceReader._LoadObjectV2(Int32 pos,ResourceTypeCode& typeCode) 在 System.Resources.ResourceReader.LoadObjectV2(Int32 pos,ResourceTypeCode& typeCode) 在 System.Resources.ResourceReader.LoadObject(Int32 pos, ResourceTypeCode& typeCode) 在 System.Resources.RuntimeResourceSet.GetObject(字符串键,布尔忽略大小写,布尔 isString) 在 System.Resources.RuntimeResourceSet.GetObject(字符串键,布尔忽略大小写) 在 System.Resources.ResourceManager.GetObject(字符串名称,CultureInfo 文化,布尔值 wrapUnmanagedMemStream) 在 System.Resources.ResourceManager.GetObject(字符串名称,CultureInfo 文化) 在 C:\Development\Project\Project.Infrastructure\Properties\Resources.Designer.cs:line 227 中的 Project.Infrastructure.Properties.Resources.get_Logo() 在 C:\Development\Project\Project.Infrastructure\Models\ShowWording.cs:line 146 中的 Project.Infrastructure.Models.ShowWording.Generate() 处

【问题讨论】:

  • 位图资源是嵌入式资源还是链接到文件?
  • 添加完整的堆栈跟踪可能会有所帮助
  • 从参考源抛出异常的行。 referencesource.microsoft.com/#mscorlib/system/resources/… 。 PDF 可能属于开关中的ByteArray 或Stream 处理,而图像属于“用户类型”,如果FEATURE_SERIALIZATION 关闭,则始终会引发异常。它实际上并没有尝试反序列化类型,它只是说该功能已被禁用。图片可能不应该使用用户类型。
  • 您能发布 Resources.resx 文件的内容吗?或者创建一个新的 .NET 5 项目,添加位图资源并比较文件。应该有一些差异,但是我没有旧项目中的这样的resources.resx。

标签: c# asp.net .net binaryformatter


【解决方案1】:

BinaryFormatter serialization methods are obsolete and prohibited in ASP.NET apps。但是,该文章没有提及 resourceReader 或其他类,即使适用相同的安全警告。

所以我认为这是一个错误。至少我希望文档明确声明不支持二进制资源或任何其他兼容性限制。我会考虑创建一个最小的可重现示例,以确保没有其他奇怪的构建问题导致该问题,并发布bug report 关于它。

请注意,.net core 中似乎有各种关于二进制资源的issuesreported,但我不清楚最终的解决方案是什么。

作为一种解决方法,可以通过将以下内容添加到项目文件中来重新启用 .Net 5 asp.Net 应用程序中的 binaryformatter。

<PropertyGroup>
  <TargetFramework>net5.0</TargetFramework>
  <!-- Warning: Setting the following switch is *NOT* recommended in web apps. -->
  <EnableUnsafeBinaryFormatterSerialization>true</EnableUnsafeBinaryFormatterSerialization>
</PropertyGroup>

【讨论】:

  • 我认为 Ian 知道这种解决方法,他试图不使用它。
  • @steeeve 我会假设RtfUtility.AppendLogo 是第三方库,如果是这样,除了更新库之外,我看不到任何其他解决问题的方法。如果 binaryFormatter 被 .net 5 API 本身使用,它可能是一个错误,应该报告。
  • 对我来说,访问 Properties.Resources.Logo 会导致异常,但让我们等待 StackTrace ;)
  • 访问资源时引发异常,而不是第 3 方库。我把它们分开了,错误仍然发生。链接或嵌入图像似乎没有任何区别......
【解决方案2】:

我找到了一个没有意义的解决方法,但我更相信它,而不是在我的项目中允许不安全的二进制格式化程序。

根据您的建议,我尝试删除并重新创建资源文件,删除并重新添加受影响的图像,但没有任何效果。

因此,由于读取 pdf 文件有效,我从图像中删除了 .png 扩展名并将其保存为文件资源。

我现在可以从资源中以二进制形式读取它并将其转换为位图,它工作正常。

using (var ms = new MemoryStream(Properties.Resources.LogoBinary))
{
   return  new Bitmap(ms);
}

我不敢相信这是框架中的一个错误,因为它会影响很多人,它一定是我的项目所特有的,但奇怪的是我在读取图像时得到 BinaryFormatter 异常,但是不是二进制文件...

感谢大家的指导和帮助...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多