TaskDialog из WinAPICodePack не работает на.NET 4.0

Я пишу заявку и хотел использовать TaskDialogIndirect функция - однако я не хотел писать огромное количество вещей P/Invoke и т. д., поэтому я включил WinAPICodePack. Хотя есть одна проблема! Когда я создаю элемент управления для TaskDialog и добавьте его в диалог все отлично работает. Однако работает Show методы приводят к OverflowException в mscorlib. Я проследил это до некоторой обработки указателей и сортировки.

В результате экспериментов с кодом я обнаружил, что DLL ДОЛЖНА быть скомпилирована для.NET 3.5 и включающего приложения TOO. Наличие моего приложения на.NET 4.0 вызывает эту ошибку... есть идеи об обходном пути - или вы даже можете воспроизвести эту ошибку?

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

Информация: Запуск Visual Studio 2012 RTM в Windows 8 Pro x64 RTM. Приложение является стандартным приложением WPF.

Образец кода:

TaskDialog td = new TaskDialog();
td.Cancelable = true;
td.Caption = "Caption";
td.InstructionText = "Instructions";
td.Text = "Text";

TaskDialogCommandLink buttonElevation =
    new TaskDialogCommandLink("elevation", "Elevation Required Sample");
buttonElevation.UseElevationIcon = true;

td.Controls.Add(buttonElevation);
td.Show(); // OverflowException occurs here!

1 ответ

Решение

Я исправил эту проблему, которая была в основном 32-битной /64-битной ошибкой. в NativeTaskDialog.cs файл там одна строка критична, она в функции

IntPtr AllocateAndMarshalButtons(
    TaskDialogNativeMethods.TaskDialogButton[] structs)

Вам нужно найти следующую строку

 currentPtr = (IntPtr)((int)currentPtr + Marshal.SizeOf(button));

и заменить его на

 currentPtr = (IntPtr)(currentPtr.ToInt64() + Marshal.SizeOf(button));
Другие вопросы по тегам