我直接从WindowsAPI Pack for .NET(包装器)中获得了TaskDialog源代码,但是每当我尝试直接在程序的静态空白Main()区域中打开TaskDialog时,它都会抛出EntryPointNotFoundException。但是,TaskDialog 稍后在我的代码中生成并显示得非常好。这是为什么呢?
引发 EntryPointNotFoundException 的代码是
/// <summary>
/// TaskDialogIndirect taken from commctl.h
/// </summary>
/// <param name="pTaskConfig">All the parameters about the Task Dialog to Show.</param>
/// <param name="pnButton">The push button pressed.</param>
/// <param name="pnRadioButton">The radio button that was selected.</param>
/// <param name="pfVerificationFlagChecked">The state of the verification checkbox on dismiss of the Task Dialog.</param>
[DllImport("ComCtl32", CharSet = CharSet.Unicode, PreserveSig = false)]
internal static extern void TaskDialogIndirect(
[In] ref TASKDIALOGCONFIG pTaskConfig,
[Out] out int pnButton,
[Out] out int pnRadioButton,
[Out] out bool pfVerificationFlagChecked);
但让我感到震惊的是,不同地方的相同代码可以工作一次,但不能在另一个时间工作。这可能与程序未加载引用或其他原因有关,但它只是让我大吃一惊。我的应用入口点处的代码是
try
{
var taskDialog = new TaskDialog();
taskDialog.WindowTitle = ".NET Update Notification";
taskDialog.MainInstruction = "";
taskDialog.MainIcon = TaskDialogIcon.Error;
taskDialog.EnableHyperlinks = true;
taskDialog.Content =
"Your .NET Framework Version is out-of-date.nPlease see <a href="***********">the forums</a> for more info.nnSorry, but I can't continue without it.nn If you had the correct install this message wouldn't appear.";
taskDialog.Callback =
new TaskDialogCallback((ActiveTaskDialog _taskDialog, TaskDialogNotificationArgs _args, object _callbackData) =>
{
if (_args.Notification == TaskDialogNotification.HyperlinkClicked)
{
Process.Start(_args.Hyperlink);
}
return false;
});
var doItButton = new TaskDialogButton();
doItButton.ButtonId = 101;
doItButton.ButtonText = "Quit";
taskDialog.Buttons = new TaskDialogButton[] { doItButton };
int result = taskDialog.Show(null);
Application.Exit();
}
/*
* Handles the error message regarding ComCtl32.dll not being found.
* In the event of the beautiful TaskDialog above (which uses ComCtl32.dll)
* cannot be opened, fall back to an ugly as **** MessageBox with a '?' Help
* button in the title bar -.-
*/
catch (EntryPointNotFoundException)
{
MessageBox.Show(
"Your .NET Framework Version is out-of-date.nTo find out how to get .NET 4.0 simply visit the forums at *********.nnSorry, but I can't continue without it :(",
".NET Update Notification", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
感谢您抽出宝贵时间:)
乔希
试试 MSDN 的这个解决方案 -
步骤 1:在解决方案资源管理器中右键单击您的项目
步骤 2:选择 -> 添加 -> 新项目
步骤 3:在 VS 2010 中添加应用程序清单文件,该文件是 app.manifest
步骤 4:取消注释从依赖项标记到/依赖项的最后一个 xml 部分
代码应该看起来像这样 -
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*"
/>