I am writing an application and wanted to use the TaskDialogIndirect
function - however I did not want to write a huge amount of P/Invoke stuff etc. so I have included the WinAPICodePack. There is one problem though! When I create a control for the TaskDialog
and add it to the dialog everything works fine. However running the Show
methods results in an OverflowException
in mscorlib. I tracked this down to some pointer handling and marshalling.
Experimenting with the code had the result, that I found out, that the DLL MUST be compiled for .NET 3.5 and the including app TOO. Having my app on .NET 4.0 invokes this error... any idea about a workaround - or can you even reproduce this error?
Another issue is that I can set the the Icon
property to whatevery I want, but the icon is not shown at all. I have to setup an Opened
event which dynamically sets the icon...
Information: Running Visual Studio 2012 RTM on Windows 8 Pro x64 RTM. Application is a standard WPF app.
Sample code:
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!
This project aims to provide a complete .NET implementation (C#) of the Task Dialog with all the features that are also available in the native APIs, with all the marshalling and memory management done under the hood. The project targets .NET Framework 4.7.2 and .NET Standard 2.0.
Only a half year ago it was promoted on channel9 as Something that should be in everyones pack -- today the Microsoft Archive is "retired" and totally keeps quiet that the API code pack ever existed. Show activity on this post.
Not detectable via API analysis. Beginning in the .NET Framework 4.5, calling MessageBox.Show from a PreviewLostKeyboardFocus handler will cause the handler to re-fire when the message box is closed, potentially resulting in an infinite loop of message boxes. It may be avoided by calling MessageBox.Show instead of MessageBox.Show.
For the Task Dialog callback, a static delegate is used to avoid the overhead of creating native functions during runtime for each new Task Dialog instance. A GCHandle is used in the callback to map the supplied reference data back to the actual Task Dialog instance.
I fixed this issues which was basically a 32bit/64bit error. In the NativeTaskDialog.cs
file there is one line critical, it's in the function
IntPtr AllocateAndMarshalButtons(
TaskDialogNativeMethods.TaskDialogButton[] structs)
You need to locate the following line
currentPtr = (IntPtr)((int)currentPtr + Marshal.SizeOf(button));
and replace it with
currentPtr = (IntPtr)(currentPtr.ToInt64() + Marshal.SizeOf(button));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With