System.Drawing.Graphings.SmoothingMode getter создает исключение ArgumentException «Параметр недействителен» - PullRequest
0 голосов
/ 21 сентября 2018

У меня большое и ресурсоемкое графическое приложение на C #, использующее DotNetBar стороннюю библиотеку пользовательского интерфейса.

Иногда происходит сбой со следующим исключением и стеком вызовов:

====================================
 ERROR 
====================================
Exception type: ArgumentException
Parameter is not valid.

====================================
 CALL STACK 
====================================
   at System.Drawing.Graphics.get_SmoothingMode()
   at DevComponents.DotNetBar.⍜.PaintCaptionBackground(FormCaptionRendererEventArgs e)
   at DevComponents.DotNetBar.Rendering.Office2007Renderer.DrawFormCaptionBackground(FormCaptionRendererEventArgs e)
   at DevComponents.DotNetBar.OfficeForm.ὀ(Graphics ٠)
   at DevComponents.DotNetBar.OfficeForm.ᲀ()
   at DevComponents.DotNetBar.OfficeForm.WindowsMessageNCActivate(Message& m)
   at DevComponents.DotNetBar.RibbonForm.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Вызывающий сбой в верхней части стека вызов просто обращается к свойству SmoothingMode и свойства get не имеют параметров, поэтому немного сложно понять, что может означать «Параметр недействителен».

Это исключение происходит спорадически, оно не воспроизводится в 100% случаев, но, похоже, действительнобыть связано с большим использованием ресурсов в моем приложении (это происходит при загрузке определенного большого «проекта» в приложение), тогда как другие более мелкие проекты не инициируют это, даже если большие и малые проекты используют интерфейс DotNetBar одинаково.

Что может заставить свойство SmoothingMode выдавать исключение ArgumentException?

1 Ответ

0 голосов
/ 03 октября 2018

Решено это, оказалось, что случай, когда объект, владеющий объектом System.Drawing.Graphics, был уничтожен

В библиотеке DotNetBar DotNetBar.BufferedBitmap объекты, которые выполняют некоторые низкоуровневые вызовы для выделения растрового изображения, а затем возвращают графику, используя Graphics.FromHdc(IntPtr).Если BufferedBitmap был удален перед использованием, то все свойства объекта Graphics будут вызывать исключение при попытке доступа к ним.

Причина, по которой растровое изображение было удалено перед использованием, быласложный и результат взаимодействия моего приложения с DotNetBar.В двух словах: сообщение WM_NCACTIVATE вызвало некоторый код для перерисовки заголовка окна, но этот код рисования заголовка вызывал OnPaint в моем приложении и косвенно вызывал WndProc, который обрабатывал другой WM_NCACTIVATE, и, таким образом, вызывал заголовок-символ кода под собой.Один уровень кода рисования субтитров заключался в удалении растрового изображения, которое не было использовано другим уровнем.

...