Вы путаете объявление типа делегата с экземпляром делегата. Да, вы сделали публичное заявление своего делегата, это было неправильно. Только класс Form1 использует его, он должен быть закрытым. Здесь важен экземпляр делегата, созданный вами с новым оператором.
Прямо сейчас вы храните экземпляр в локальной переменной конструктора Form1. Это сохраняет ссылку на экземпляр в течение нескольких микросекунд. Как только конструктор завершает работу, эта ссылка исчезает, и сборщик мусора может собирать экземпляр делегата в любой момент после этого. Он не может видеть, что неуправляемый код сохраняет ссылку на него, сборщик может обнаруживать только ссылки, содержащиеся в управляемом коде.
Ничего хорошего не происходит, когда неуправляемый код вызывает обратный вызов в собранном экземпляре делегата, вы услышите громкий звук kaboom. Вы должны изменить свой код, чтобы была управляемая ссылка на экземпляр. Один из простых способов сделать это - добавить закрытый член в класс Form1 для хранения экземпляра.
Даже если это может быть недостаточно хорошо, объект Form1 также будет собирать мусор в будущем. Который также собирает объект делегата. Вы также должны убедиться, что неуправляемый код не может использовать обратный вызов после того, как это произойдет. Учитывая имя класса (Form1), это вряд ли произойдет в этом конкретном случае. Но защитите код и сделайте вызов, который сбрасывает обратный вызов в обработчике событий FormClosing формы.