Вы можете сделать это с помощью события, которое вызывается из вашей библиотеки, таким образом, библиотеке нужно будет только извлечь событие, если пользовательский интерфейс решит использовать событие, то это реализация в пользовательском интерфейсе.
Вы также можете предоставить свойство, например CallbackMethod, и иметь делегата, который он принимает, затем в пользовательском интерфейсе вы задаете для свойства адрес вашей функции.
Когда библиотеке необходимо «отправить необходимый обратный вызов», вы проверяете, заполнен ли обратный вызов, а затем вызовите функцию обратного вызова (через делегат), если она установлена, или просто пропустите ее, если у нее нет