2016-03-11 1 views
0

Я видел подобные ошибки здесь, но не могу определить, что вызывает его.Ошибка ReportAvOnComRelease с маршалом.Release()

У меня есть IntPtr, который ссылается на GetForegroundWindow() объект:

IntPtr ptr = GetForegroundWindow(); 

Этот GetForegroundWindow() метод как таковой:

[DllImport("user32.dll")] 
private static extern IntPtr GetForegroundWindow(); 

Это, в свою очередь, используется для установления GetExecutablePath() метод:

string name = GetExecutablePath(ptr); 

После такого времени я звоню пресловутый Marshal.Release()

Marshal.Release(ptr); 

После чего я получаю следующее сообщение об ошибке:

Managed DEBUGGING Помощника 'ReportAvOnComRelease' обнаружил

Некоторые больше информации включает в себя :

Дополнительная информация: An e xception был пойман, но обработан при выпуске указателя интерфейса COM через Marshal.Release, Marshal.ReleaseComObject или неявно после того, как соответствующий RuntimeCallableWrapper был собран мусором. Это результат ошибки пользователя refcount или другой проблемы с выпуском COM-объекта. Убедитесь, что refcounts управляются должным образом. Хотя эти типы исключений попадают в CLR, они все равно могут привести к коррупции и потере данных, поэтому, если возможно, следует устранить проблему, вызывающую исключение.

Для меня это предполагает, что существует очень высокая вероятность утечка памяти или повреждение указателя.

Я, похоже, не могу установить причину, поскольку вы можете видеть из чрезвычайно простого и простого использования.

Любые предложения по отладке и/или устранению этой проблемы?

ответ

2

Вы нечеткие по концепции COM. Вы не используете ни одного, это простой pinvoke. MDA правильно сообщает вам, что то, что вы делаете, не имеет никакого смысла.

Marshal.Release() предназначен только для уменьшения количества ссылок на указатель интерфейса COM. Не ручка окна. Время жизни окна контролируется пользователем или потоком, создавшим окно. Поэтому вы не должны пытаться «освободить» возвращаемое значение GetForegroundWindow().

Просто удалите Marshal.Release().

+0

* Facepalm * - Спасибо .. (Мозг ненавидит пятницы) – Pogrindis

 Смежные вопросы

  • Нет связанных вопросов^_^