asp.net 当加载位图资源时,.net 5应用程序不支持BinaryFormatter

k75qkfdt  于 2023-04-13  发布在  .NET
关注(0)|答案(4)|浏览(197)

我已经将几个ASP.NetCore2.2项目迁移到了.Net5,最后一个问题是当我试图从项目资源加载位图时,我得到了System.NotSupported异常。

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

System.NotSupportedException HResult= 0x 80131515 Message=BinaryFormatter序列化和反序列化在此应用程序中被禁用。有关详细信息,请参阅https://aka.ms/binaryformatter。Source=System.Runtime.Serialization.Formatters
我没有显式使用BinaryFormatter,但奇怪的是,当以同样的方式加载二进制PDF文件时,我没有收到错误:

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

这两种机制都使用了ResourceManager.GetObject,所以我不确定发生了什么。我知道我可以关闭项目文件中的错误,但这似乎是一个短期的解决方案,我宁愿修复它并忘记它。感谢您给予的任何建议...
编辑:
堆栈跟踪如下,错误不是由库引起的,它是在访问资源时.它发生在图像嵌入或链接时-似乎没有区别,但不会发生(二进制)PDF文件.
谢谢你看这个...
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)at System.Resources.ResourceReader.〈〉c__DisplayClass7_0`1.b__0(Objectobj,Streamstream),位于System.Resources.ResourceReader.DeserializeObjectSystem.Resources.ResourceReader._LoadObjectV2中的(Int 32 typeIndex)System.Resources.ResourceReader.LoadObjectV2中的(Int 32 pos,ResourceTypeCode& typeCode)(Int 32位,资源类型代码和类型代码)位于系统.资源.资源读取器.加载对象(Int 32 pos,ResourceTypeCode& typeCode)位于System.Resources.RuntimeResourceSet.GetObjectSystem.Resources.RuntimeResourceSet.GetObject中的(String键,Boolean ignoreCase,Boolean isString)System.Resources.ResourceManager.GetObject中的(String键,Boolean ignoreCase)(String name,CultureInfo culture,Boolean wrapUnmanagedMemStream)at System.Resources.ResourceManager.GetObject(String name,CultureInfo culture)at Project.Infrastructure.Properties.Resources.get_Logo()in C:\Development\Project\Project.Infrastructure\Properties\Resources.Designer.cs:line 227 at Project.Infrastructure.Models.ShowWording.Generate()in C:\Development\Project\Project.Infrastructure\Models\ShowWording.cs:line 146

kh212irz

kh212irz1#

但是,本文没有提到任何关于resourceReader或其他类的内容,即使应用了相同的安全警告。
所以我认为这是一个bug。至少我希望文档明确说明不支持二进制资源,或者任何其他兼容性限制。我会考虑创建一个最小的可重复示例,以确保没有其他奇怪的构建问题导致问题,并发布一个bug report
注意.net core中似乎有各种关于二进制资源的issuesreported,但我不清楚最终的解决方案是什么。
作为一种解决方法,有一个选项可以通过将以下内容添加到项目文件中来重新启用.net5asp.net应用程序中的binaryformatter。

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

z2acfund2#

看起来Visual Studio/.Net以前将图像添加为可访问的资源Image,这使用了BinaryFormatter,而如果我现在添加图像,它们可以作为byte[]访问。
我能够更新资源文件,只返回byte[],只需:
1.将 *.Designer.cs文件中的System.Drawing.Bitmap替换为byte[]
1.将 *.resx文件中的System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a替换为System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
以前:

// In the *.Designer.cs file
public static System.Drawing.Bitmap MyImage {
  get {
    object obj = ResourceManager.GetObject("MyImage", resourceCulture);
    return ((System.Drawing.Bitmap)(obj));
  }
}

// In the *.resx file
<data name="MyImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Path\To\MyImage.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
  </data>

现在:

// In the *.Designer.cs file
public static byte[] MyImage {
  get {
    object obj = ResourceManager.GetObject("MyImage", resourceCulture);
    return ((byte[])(obj));
  }
}

// In the *.resx file
<data name="MyImage" type="System.Resources.ResXFileRef, System.Windows.Forms">
    <value>Path\To\MyImage.jpg;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value></value>
  </data>
u4vypkhs

u4vypkhs3#

我找到了一个解决办法,这没有意义,但我相信它比允许不安全的二进制格式在我的项目。
根据您的建议,我尝试删除并重新创建资源文件,删除并重新添加受影响的图像,但没有任何效果。
因此,因为阅读PDF文件有效,所以我从图像中删除了.png扩展名并将其保存为文件资源。
我现在可以从资源中读取它作为二进制文件,并将其转换为位图,它工作得很好。

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

我不敢相信这是框架中的一个错误,因为它会影响很多人,它一定是我的项目特有的东西,但奇怪的是,我在阅读图像时得到BinaryFormatter异常,而不是二进制文件。
感谢大家的指导和帮助...

wmvff8tz

wmvff8tz4#

将以下属性组添加到.csproj文件中:

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

相关问题