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));