为什么MeasureString抛出读/写内存错误?

问题描述

我已经四处寻找试图解决这个问题的方法了,但实际上根本无法将我的头放在读取/写入内存上。我以为C ++的读/写内存更多,因为您可以在c#通常负责的地方进行管理。不过,下面是我创建的名为 DrawLevelCard 函数的粘贴链接。这样做的目的是为我的不和谐行为打平卡。问题是有时它会在显示以下内容的行上引发错误

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

解决方法

由于@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