Я новый программист на 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 их тоже не было. Читать здесь
Я в своем уме. Любая помощь приветствуется.