Вам необходимо сохранить ссылку на ваш объект.
Событие работает в другом направлении, сохраняя объект, к которому событие будет запущено, а не источник события.
Если вы добавите несколько вызовов в GC.Collect и GC.WaitForPendingFinalizers, я почти уверен, что вы можете спровоцировать проблему довольно быстро.
Позвольте мне конкретизировать мой ответ.
Событие - это просто замаскированный делегат. Маскировка просто удаляет некоторые возможности, связанные с делегатами, так что внешний код не может делать с базовым делегатом все, что ему нужно, но в глубине души это обычный делегат.
Так что же такое делегат? Делегат, который ссылается на один метод, состоит из двух вещей:
- Справочник методов
- Ссылка на объект (цель)
Когда событие вызывается объектом, который его определяет, например, вызывается событие «Button.Click», определенный метод (например, bt_Click) запускается для конкретного объекта (например, экземпляра Form1).
Таким образом, событие содержит ссылку наружу в направлении объекта, для которого определен метод. Событие ничего не делает с этим другим объектом, поэтому другой объект, такой как Form1 в моем примере выше, никоим образом не связан с этим событием и не содержит ссылку на этот объект.
Итак, в вашем случае, скажем, у вас есть этот код:
AppSubclass app = new AppSubclass(); // this starts monitoring
Если вы теперь позволите этой переменной выпасть из области видимости, этот объект будет пригоден для сбора, поскольку ничто не содержит ссылку на него. То, что существуют внутренние ссылки между AppSubclass и SpecialAppWndProc, не имеет значения, ссылки могут быть в обоих направлениях, но если никакой внешний код не содержит ссылку на него, эти объекты могут быть собраны.
Так что вам нужно где-то хранить ссылку на ваш объект, чтобы избежать его сбора.
Чтобы ответить на ваш первоначальный вопрос, который был «C #: что уничтожает мой объект NativeWindow и почему?», Ответ состоит в том, что сборщик мусора уничтожает ваш объект NativeWindow, и причина в том, что здесь нет ссылка на него (под корневой ссылкой я имею в виду ссылку, хранящуюся в статической переменной, переменной-члене других корневых ссылок или в качестве локальной переменной в активном методе.)