我已经将几个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
4条答案
按热度按时间kh212irz1#
但是,本文没有提到任何关于resourceReader或其他类的内容,即使应用了相同的安全警告。
所以我认为这是一个bug。至少我希望文档明确说明不支持二进制资源,或者任何其他兼容性限制。我会考虑创建一个最小的可重复示例,以确保没有其他奇怪的构建问题导致问题,并发布一个bug report。
注意.net core中似乎有各种关于二进制资源的issuesreported,但我不清楚最终的解决方案是什么。
作为一种解决方法,有一个选项可以通过将以下内容添加到项目文件中来重新启用.net5asp.net应用程序中的binaryformatter。
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
以前:
现在:
u4vypkhs3#
我找到了一个解决办法,这没有意义,但我相信它比允许不安全的二进制格式在我的项目。
根据您的建议,我尝试删除并重新创建资源文件,删除并重新添加受影响的图像,但没有任何效果。
因此,因为阅读PDF文件有效,所以我从图像中删除了.png扩展名并将其保存为文件资源。
我现在可以从资源中读取它作为二进制文件,并将其转换为位图,它工作得很好。
我不敢相信这是框架中的一个错误,因为它会影响很多人,它一定是我的项目特有的东西,但奇怪的是,我在阅读图像时得到BinaryFormatter异常,而不是二进制文件。
感谢大家的指导和帮助...
wmvff8tz4#
将以下属性组添加到.csproj文件中: