Получение ReportAvOnComRelease Exception при использовании стороннего COM - PullRequest
1 голос
/ 21 мая 2010

Я новый программист на C # и создал приложение, которое использует сторонний COM-объект для отслеживания записей телефонных звонков с сервера записи звонков. Создатель программного обеспечения COM также является поставщиком программного обеспечения для записи вызовов, так что вы думаете, что оно должно работать. Я был на многих телефонных звонках и проверках кода с их сотрудниками, и они придумали очень мало, чтобы помочь.

Приложение реагирует на события из COM-объекта, такие как OnCallStart и OnCallEnd, AgentLogon, AgentLogoff, ServerDown и т. Д. Я ничего не делаю, кроме как отслеживаю, что возвращают события, и записываю его в файл. Приложение без проблем компилируется и запускается в течение нескольких минут, а затем выдает следующую ошибку (мне пришлось открыть исключение в меню «Отладка> Исключения», чтобы увидеть его):

ReportAvOnComRelease был обнаружен
Сообщение: исключение было перехвачено, но обработано при освобождении указателя интерфейса COM через Marshal.Release или Marshal.ReleaseComObject или неявно после того, как соответствующий RuntimeCallableWrapper был собран сборщиком мусора. Это результат ошибки пользователя или другой проблемы с выпуском COM-объекта. Убедитесь, что refcounts управляются правильно. Исходный указатель vtable указателя интерфейса COM был 0x45ecbac. Хотя эти типы исключений обнаруживаются CLR, они все же могут привести к повреждению и потере данных, поэтому, если возможно, следует устранить проблему, вызывающую исключение.

Это дает мне не более того. Никаких подробностей, пересчетов или чего-либо еще. Я кодировал GC.Collect () и позволил приложению работать в течение минуты, а затем запустил GC.Collect и получил ошибку. Я могу сделать это с некоторой последовательностью. Я читал статью за статьей об этой ошибке и необходимости правильно маршала, но я не тот маршал. VS создает RCW для COM-объекта, и я использую его, чтобы у меня там не было контроля, или нет? Ни одна из статей не дала мне никаких примеров кода или чего-либо, кроме теоретической болтовни.

Есть ли лучший способ сделать это? Как я могу найти именно то, что вызывает ошибку? Кажется, нет никакого способа изолировать эту вещь. Я нашел одну статью от парня из Microsoft, которая назвала это «Silent Assassin», но он не дал решений и, по сути, признал, что у MS их тоже не было. Читать здесь

Я в своем уме. Любая помощь приветствуется.

1 Ответ

1 голос
/ 21 мая 2010

Ну, это серьезный дефект используемого вами COM-сервера. Да, это косвенно инициируется CLR, последний счетчик ссылок COM-объекта сбрасывается, когда поток финализатора запускает финализатор RCW. Marshal.ReleaseComObject считает счетчик ссылок до 0, а метод реализации IUnknown :: Release () COM-сервера очистит объект.

Это всегда уязвимое время для COM-сервера. Когда ранее он повредил кучу, обычно для запуска аппаратного сбоя ЦП (AV = Access Violation) освобождается память. Microsoft установила ловушку для этого аппаратного исключения, чтобы помочь диагностировать проблему. Без этого у вас было бы очень мало шансов выяснить, что произошло, потому что финализатор работает в непредсказуемое время без активного выполнения собственного кода.

Ошибка довольно серьезная, у вас осталась поврежденная куча, которая только частично очищена. Если вы продолжите, вы, как правило, просто получите больше AV и / или вы потеряете память. Худший возможный результат, вполне вероятно, между прочим, заключается в том, что впоследствии он не умирает, а просто начинает генерировать неверные данные или ведет себя непредсказуемо, что заставляет вас думать, что это ваш код, который содержит ошибки.

Существует только одна сторона, которая может решить эту проблему, поставщик этого COM-сервера. Тщательно укажите машину, на которой вы работаете, особенно важна версия операционной системы, и дайте им небольшой фрагмент кода (включая исходный код), который воспроизводит исключение. Важно держать его маленьким и хорошо видимым, иначе они будут утверждать, что именно ваш код повредил кучу. В любом случае, они, скорее всего, так и сделают, повреждение кучи очень трудно отладить. Если вы не можете заставить их реагировать, вы должны выбрать другого продавца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...