При разработке приложения взаимодействия WPF / WinForms я столкнулся с неприятной проблемой. Я пытался решить эту проблему в течение трех дней, но я не могу добиться успеха. Я сомневаюсь, что могу предоставить достаточно информации, чтобы получить разрешение, но я ищу любого, кто мог бы объяснить что здесь происходит?
Компонентом, который я использую, является AxMapControl (ESRI ArcGIS Engine 9.3.1 SP2), который, насколько я знаю, является нативным кодом в COM-оболочке и представлен как элемент управления WinForms. Компонент встроен в наше клиентское программное обеспечение WPF (.NET 3.5) с использованием WPF WinFormsHost proxy.
Периодически приложение сильно падает с AccessViolationException
. Это всегда происходит в ответ на щелчок мышью пользователя на элементе управления картой, но, похоже, нет какой-либо рифмы или причины того, что именно вводит. Трассировка стека всегда одинакова:
System.AccessViolationException: попытка чтения или записи в защищенную память. Это часто указывает на то, что другая память повреждена.
в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc (IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в System.Windows.Forms.NativeWindow.DefWndProc (Message & m)
в System.Windows.Forms.Control.DefWndProc (сообщение & m)
в System.Windows.Forms.AxHost.WndProc (сообщение & m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage (Message & m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc (Message & m)
в System.Windows.Forms.NativeWindow.Callback (IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
Поскольку исключение, похоже, выбрасывается за пределы любого стека вызовов, инициированного моим кодом, я не могу понять, как перехватить исключение и обработать его программно.
Эта проблема возникает в режиме отладки, а также в сборках выпуска. Однако это происходит не на всех компьютерах, но я смог повторить эту проблему в Windows 7 и XP, а также .NET Framework 3.5 и 4.0.
Проверка того, что происходит в процессе во время сбоя, кажется, что обнаруживается аномалия в том, что в развернутых GAC DLL выполняется несколько операций CreateFileMapping
, которые завершаются с ошибкой FILE LOCKED WITH ONLY READERS
.

Это представление было отфильтровано, чтобы показывать только результаты этого типа, но, похоже, это происходит ровно дважды с каждой DLL. Это что-то значит?
Теперь очевидно, что я не знаю, что происходит и как решить эту проблему. Если у вас есть подсказка, не могли бы вы быть добрыми и объяснить мне, с каким типом проблемы я имею дело?
Есть идеи, как я могу отладить эту проблему?