Программа, над которой я работаю 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!");
Несмотря на использование DebugType «portable» или «встроен» в файл csproj, размер файла .dmp не изменился, и мне не удалось перемещаться по стеку вызовов со ссылками на исходный код моей собственной сборки или найти PDB. Результат «не все символы найдены» сработал для моей собственной сборки — он был исправлен после установки DebugType — но это срабатывает для некоторых пакетов NuGet, которые я использую, и моя собственная сборка вызывает результат «не все символы имеют Информация о ссылке на источник». Я не уверен, какова будет цель ссылки на источник, если я также рассылаю символы вместе с приложением, и я не знаю, актуально ли наличие ссылки на источник для внутренних приложений (хотя я рад узнать об обратном!)
Важно — эта программа прекрасно работает на моем ноутбуке. Независимо от режима — запуска через развертывание ClickOnce или через отладчик Visual Studio 2022 и т. д. — с ним проблем не возникает. По крайней мере, на этом уровне. Мы используем одну и ту же ОС, с одной и той же архитектурой, и среда выполнения должна быть функционально идентична из-за внедрения сборок .NET.
Удалите отдельные вызовы COM-интерфейса, которые казались чтобы быть сломанным, и выяснилось, что любые вызовы к нему прерываются.
Добавлено построчное журналирование для опроса программы на различных этапах выполнения.
Опубликовано приложение с использованием конфигурации отладки и внедрены символы в сборку.
Опубликовано под указанной архитектурой платформы (x86) вместо «anycpu», чтобы определить, связано ли это как-то с сборка конечного результата.
Планирую протестировать эту проблему на другой из моих рабочих станций, но сначала необходимо установить приложение COM.
Я' Я относительно новичок в этом уровне программирования, и мне трудно осознать, какие шаги следует предпринять, чтобы использовать файл дампа сбоя и получить больше информации о том, что происходило во время сбоя.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/791 ... -an-access
Мобильная версия