[DllImport ( "ComCtl32", ...)]
Библиотека использует довольно тяжелый ярлык для использования Windows DLL библиотеки comctl32.dll.Это имеет тенденцию заканчиваться случайно, но оно падает в вашем коде.Полное объяснение довольно многословно, я постараюсь сделать его кратким.
Основная проблема заключается в том, что Windows имеет две версии comctl32.dll.Версия в c: \ windows \ system32 является устаревшей версией, реализующей общие элементы управления, как они выглядели и работали в Windows 2000 и более ранних версиях.В Windows XP появились визуальные стили, благодаря которым элементы управления выглядят совершенно иначе.Есть другая DLL, которая реализует эти визуальные стили, она хранится в параллельном кэше Windows (c: \ windows \ winsxs).
Приложение должно явно указать Windows, что оноподдерживает новую версию DLL.Есть два способа сделать это, вы можете сделать это в манифесте (как это делает WPF) или вызвать вызов операционной системы, функцию CreateActCtx () (как это делает Winforms).
Библиотека работает так, что надеется на то, что кто-то сделал одну из этих двух вещей.И загрузил правильную версию comctl32.dll, чтобы при точном вызове функции [DllImport] фактически не загружалась версия c: \ windows \ system32.Старый, который не реализует TaskDialogIndirect ().Это работает случайно, потому что какой-то код обычно делает.И тот факт, что Windows заботится только об имени DLL, а не о том, откуда она взялась, чтобы определить, нужно ли ей загружать DLL.
Я могу несколько догадаться, как вам не повезло.Вы используете Control.Invoke (), то, что вам когда-либо нужно делать, когда вы используете потоки.Очевидно, вы отображаете эту форму в другом потоке, а не в основном потоке пользовательского интерфейса.В целом это действительно плохая идея, поток пользовательского интерфейса уже был разработан, чтобы иметь возможность обрабатывать несколько окон.Единственное, чего не произошло, что обычно происходит в потоке пользовательского интерфейса, - это вызов Application.EnableVisualStyles ().Тот, который сообщает Windows, что вы хотите новую версию comctl32.
Вы можете попробовать вызвать его в своем рабочем потоке.Может работать, понятия не имею.Безусловно, лучшее решение - не создавать окна в рабочих потоках.Вы можете избавиться от библиотеки Wonky, используя Windows API Code Pack, он предоставляет оболочку для диалогов задач.