为啥 MeasureString 会抛出读/写内存错误?

Posted

技术标签:

【中文标题】为啥 MeasureString 会抛出读/写内存错误?【英文标题】:Why is MeasureString throwing read/write memory error?为什么 MeasureString 会抛出读/写内存错误? 【发布时间】:2020-12-22 06:47:34 【问题描述】:

我已经四处寻找这个问题的答案,但我根本无法理解读/写内存。我认为读/写内存更适合 C++,因为你在那里管理它,因为 C# 通常会处理它。尽管如此,下面是我创建的名为 DrawLevelCard 的函数的 pastebim 链接。这样做的目的是为我的不和谐制作一张等级卡。问题是有时它会在以下行引发错误:

var measure3 = gr.MeasureString(" / " + ExpNeeded + " Exp", Levelfont);

错误: An unhandled exception of type 'System.AccessViolationException' occurred in System.Drawing.Common.dll Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

这不会发生在任何其他行上,如果我将其全部删除,没有它我将无法复制它。问题是这对于我设置图像的方式有点必要。 PasteBin:https://pastebin.com/ab00GLLs

参考卡片图片: https://i.imgur.com/q7nz2K6.png

更新:如果有人需要额外信息,这里是完整的课程:) https://pastebin.com/Bbi7zt2b

【问题讨论】:

请在您的问题正文中分享minimal reproducible example。 @mjwills,我的代码都没有重现这个问题,这就是问题所在。运行机器人时是随机的。 所有托管代码?没有 P/Invoke 或 COM 互操作?堆栈中有什么有趣的东西(我怀疑不会有)? @mjwills 如果需要,我将删除该帖子,因为我没有办法显示它。 :// @Flydog57 不。 【参考方案1】:

感谢@MitchWheat的回复,我想我已经找到了解决办法。如果结果属实,我会批准这个解决方案。我认为这是由GetFontName() 多次向集合中添加字体文件引起的。这是我之前完全忘记修复的问题。

我多次调用它,如果它当前正在被读取,那么它可能会标记

        private static Font GetFontName(float msSize)
        
            PrivateFontCollection collection = new PrivateFontCollection();
            collection.AddFontFile(@".\Fonts\Tommy Soft Regular.otf");
            FontFamily fontFamily = new FontFamily("MADE Tommy Soft", collection);
            return new Font(fontFamily, msSize);
        

更新:不知何故,我设法解决了这个问题,而不是将函数设置为变量,而是将函数设置为在每次运行测量字符串时运行。 var measure3 = gr.MeasureString(" / " + ExpNeeded + " Exp", GetFontName(16)); 我不知道为什么这解决了这个问题,甚至不知道它是否完全解决了这个问题。如果问题再次出现,我将确保更新此帖子。希望有人能给我和其他人一些关于为什么会发生这种情况的见解。

如果有人想比较它们,这里是更新的类:https://pastebin.com/r92zKjhW

【讨论】:

以上是关于为啥 MeasureString 会抛出读/写内存错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 FileOutputStream 会抛出 FileNotFoundException?

为啥“prepareCall”会抛出 NumberFormatException?

为啥 BluetoothSetLocalServiceInfo 会抛出错误 1314?

为啥geoip会抛出异常?

为啥这个 OdbcConnection 会抛出 System.InvalidOperationException?

为啥 jsonwebtoken 会抛出“无效签名”错误?