Какие шаги я могу предпринять для устранения проблемы с развернутой программой, имеющей AccessViolationException?C#

Место общения программистов C#
Ответить
Anonymous
 Какие шаги я могу предпринять для устранения проблемы с развернутой программой, имеющей AccessViolationException?

Сообщение Anonymous »

На прошлой неделе я потратил некоторое время на изучение этой проблемы. Я видел несколько тем на StackOverflow, посвященных AccessViolationException, но не смог найти ничего подходящего, особенно учитывая, что это исключение настолько широко распространено.
Программа, над которой я работаю on — это относительно простое приложение C# WPF, которое интегрируется с COM-объектами другого приложения (не разработанных внутри компании) и использует рабочие потоки через методы Task для обработки информации и ожидания ответов от COM-объекта, чтобы все было разделено между пользовательским интерфейсом и интеграция. У меня есть статический класс, который содержит ссылку на COM-объект и через который я маршрутизирую все вызовы Task для взаимодействия с другим приложением. Среда выполнения .NET 8.0, развернутая на нашем сервере с помощью ClickOnce, со средой выполнения и библиотеками, включенными в установку для простоты использования и устранения административных требований для установки и обновления.
Большая проблема — на компьютере конечного пользователя, хотя и не на моем, приложение аварийно завершает работу после связывания с COM-приложением с исключением AccessViolationException, в котором подробно описывается, что поток пытался получить доступ к некоторой памяти, к которой у него нет доступа. Приложение COM открывается в фоновом режиме перед сбоем всего процесса.
Программа запускается с панели главного окна и кнопки для запуска фактического процесса соединения с COM-объектом другого приложения. Как только все будет проверено, взаимодействие с другим приложением откроется.
Я отправил демо-версию конечному пользователю, чтобы он начал тестирование. Они скачали его через развертывание ClickOnce. Он открывается нормально, но происходит сбой после использования кнопки для открытия интерфейса COM-объекта, в частности, через некоторое время после использования App = new ComApplication();, где ComApplication — это рассматриваемый интерфейс. Мы видим, как ComApplication открывается в фоновом режиме, но через несколько секунд происходит сбой.
Ссылка на COM-интерфейс построена на основе некоторых (старых и не совсем документированных) примеров из разработчики ComApplication. Я добавил ссылку COM в свой проект в их библиотеку Interop.Application. Я использую «Встроить типы взаимодействия = Да» и «Копировать локально = Да». Насколько я могу судить, библиотека Interop.Application не встроена в публикуемую сборку, которую я отправляю, но COM-интерфейс также регистрируется на ноутбуке пользователя.
Использование журналирования , происходит сбой между созданием экземпляра ComApplication и вызовом любого поля или метода в нем (это все в потоке Task!):

Код: Выделить всё

App = new ComApplication();

if (App = null) {
Logger.Error("Failed to open the Com Object!");
return false;
}

Logger.Info("COM object open!");

// Crashes before the next log call.
App.Visible = true;

Logger.Info("COM app visible!");
Отправил обновленную сборку через ClickOnce, используя конфигурацию отладки, чтобы попытаться получить дополнительную информацию. Схватил файл .dmp и разобрался с тем, что происходит. Выдает конкретную ошибку: «0xC0000005: поток пытался прочитать или записать на виртуальный адрес, к которому у него нет соответствующего доступа».
Несмотря на использование DebugType «portable» или «встроен» в файл csproj, размер файла .dmp не изменился, и мне не удалось перемещаться по стеку вызовов со ссылками на исходный код моей собственной сборки или найти PDB. Результат «не все символы найдены» сработал для моей собственной сборки — он был исправлен после установки DebugType — но это срабатывает для некоторых пакетов NuGet, которые я использую, и моя собственная сборка вызывает результат «не все символы имеют Информация о ссылке на источник». Я не уверен, какова будет цель ссылки на источник, если я также рассылаю символы вместе с приложением, и я не знаю, актуально ли наличие ссылки на источник для внутренних приложений (хотя я рад узнать об обратном!)
Важно — эта программа прекрасно работает на моем ноутбуке. Независимо от режима — запуска через развертывание ClickOnce или через отладчик Visual Studio 2022 и т. д. — с ним проблем не возникает. По крайней мере, на этом уровне. Мы используем одну и ту же ОС, с одной и той же архитектурой, и среда выполнения должна быть функционально идентична из-за внедрения сборок .NET.
Удалите отдельные вызовы COM-интерфейса, которые казались чтобы быть сломанным, и выяснилось, что любые вызовы к нему прерываются.
Добавлено построчное журналирование для опроса программы на различных этапах выполнения.
Опубликовано приложение с использованием конфигурации отладки и внедрены символы в сборку.
Опубликовано под указанной архитектурой платформы (x86) вместо «anycpu», чтобы определить, связано ли это как-то с сборка конечного результата.
Планирую протестировать эту проблему на другой из моих рабочих станций, но сначала необходимо установить приложение COM.
Я' Я относительно новичок в этом уровне программирования, и мне трудно осознать, какие шаги следует предпринять, чтобы использовать файл дампа сбоя и получить больше информации о том, что происходило во время сбоя.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/791 ... -an-access
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»