2016-01-20 4 views
1

У меня возникли проблемы с моим WPF-приложением Windows C#. Всякий раз, когда приложение закрывается, оно выдает System.ObjectDisposedException. Проблема возникает, когда она скомпилирована в 32-разрядной версии. 64-разрядная версия отлично работает, не вызывая никаких исключений.ObjectDisposedException - Не удается получить доступ к удаленному объекту

Из сообщения об исключении, он говорит, что не может получить доступ к удаленному объекту, но, похоже, не указывает, какой объект вызывает проблему. Как узнать объект, который был удален?

Исключение: Брошено: «Невозможно получить доступ к расположенному объекту». (System.ObjectDisposedException) Исправлено System.ObjectDisposedException: «Невозможно получить доступ к удаленному объекту». Время: 1/19/2016 5:16:28 PM Тема: [1552]

Exception Информация: System.ObjectDisposedException Stack: на System.Diagnostics.EventLogInternal.OpenForWrite (System.String) в системе .Diagnostics.EventLogInternal.InternalWriteEvent (UInt32, UInt16, System.Diagnostics.EventLogEntryType, System.String [], Byte [], System.String) в System.Diagnostics.EventLogInternal.WriteEntry (System.String, System.Diagnostics.EventLogEntryType , Int32, Int16, Byte []) в System.Diagnostics.EventLog.WriteEntry (System.String, System.Diagnostics.EventLogEntryType) на HP.HPTRIM.SDK.TrimApplicationBase.UnregisterStackTrace (System.Object, Int32) в HP.HPTRIM.SDK.Database.internal_Dispose() в HP.HPTRIM.SDK.Database.Finalize()

+0

Действительно ли 'HP.HPTRIM.SDK' ваш код? – MickyD

+0

Это файл .dll, который использует мой код –

+0

Либо вы удаляли базу данных HP раньше, либо это неверный сторонний SDK. Есть ли еще трассировка стека? – MickyD

ответ

1

Возможно, это слишком поздно, чтобы быть полезным, но я наткнулся на это, потому что недавно я столкнулся с очень похожими (идентичными?) Проблемами при использовании SDK HP Records Manager (v8.3 в моем случае). Я считаю, что я определил причину.

Ошибка в моем собственном коде (исполняемый файл с использованием SDK .Net SDK для подключения к HPRM), где я не вызывал Dispose() на одном из своих SDK-объектов).

Похоже, что когда GC подходит для очистки, так как исполняемый файл выходит, HP решает, что хочет записать сообщение в журнал событий приложений Windows, указав, что разработчик забыл .Dispose() объекта должным образом. По какой бы то ни было причине, похоже, в SDK HP обнаружена ошибка, из-за которой в это время она удалила свою внутреннюю систему для записи в журнал событий. (Иногда это работает для меня, иногда нет. Вероятно, состояние гонки находится где-то в SDK.)

Последствием было то, что после окончания моего кода. Framework Framework подскочила и закричала о попытке использования HP SDK расположенный объект для записи в журнал событий.

Непосредственным решением для меня было исправить свой собственный код. Как только я удалю все объекты, на которых я был предназначен (в частности, соединение с базой данных, которое я создал), цепочка событий не была запущена. Действительно, код HP также кажется ошибочным.

+1

Спасибо. Это было именно то, что я сделал для решения проблемы. –

0

Если посмотреть на последней строке трассировки стека вы увидите, что проблема вызванных в Dispose() объекта HP.HPTRIM.SDK.Database.

0

Это не такой большой ответ, поскольку он слишком длинный, чтобы сделать его полезным в комментарии.

Я провел некоторое время в ILSpy, глядя на класс EventLog. Этот самый внутренний метод в исключении, EventLogInternal.OpenForWrite, предназначен для явного броска ObjectDisposedException, когда установлен один из его внутренних флагов. (И хотя это всегда возможно, что ObjectDisposedException вы получаете не конкретно от этой линии, интересно отметить.)

private void OpenForWrite(string currentMachineName) 
{ 
    if (this.boolFlags[256]) 
     throw new ObjectDisposedException(base.GetType().Name); 
    ... 
} 

Флага это проверка только получает значение, когда Dispose метода этого EventLog экземпляра был назван , что означает, что экземпляр EventLog активно утилизируется. Так как это что-то не под вашим контролем, это может быть ошибкой в ​​реализации HP.HPTRIM.SDK.Database в HP TRIM, поскольку один из двух методов HP, перечисленных в исключении, будет содержать ссылку на экземпляр EventLog.

Также стоит отметить, что это исключение инициируется, потому что экземпляр HP.HPTRIM.SDK.Database не находится правильно (при условии, что его IDisposable) во время закрытия приложения и ему просто разрешено выходить из сферы действия. В качестве теста вы можете попробовать избавиться от экземпляра HP.HPTRIM.SDK.Database, который не во время закрытия приложения, и посмотреть, можете ли вы реплицировать ошибку.

Что бы это ни было связано с битностью, я не могу сказать.