在C#中使用TaskDialog时的EntryPointNotFoundException

Viv*_*lin 8 c# pinvoke taskdialog windows-7

我正在使用以下代码来调用TaskDialog.

    [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);
Run Code Online (Sandbox Code Playgroud)

但是,我得到异常"无法在DLL'ComCtl32'中找到名为'TaskDialogIndirect'的入口点."

我拿了这个代码.我使用的是Windows 7 x64(RC).

我究竟做错了什么?

alm*_*ori 9

除此之外没有任何东西是vista功能

更新:此探针与并排程序集有关:这些函数仅存在于comctl32.dll版本6中,但出于兼容性原因,Vista将加载早期版本,除非您另有说明.大多数人(包括我)采取的方法是使用清单.这已被证明是棘手的,并且可能不是正确的解决方案,特别是如果您正在编写的是库:您不一定要强制整个应用程序使用通用控件6.

正确的解决方案是在调用其中一个仅限Vista的API时推送新的激活上下文.激活上下文将使用正确版本的comctl32.dll,同时保留应用程序的其余部分,并且不需要清单.

幸运的是,这很容易做到.一些已经存在的完整代码MS知识库.文章中的代码(KB 830033)就是这样做的.

替代托管API:可以在此处找到Vista的TaskDialog和TaskDialogIndirect的完整包装:

http://code.msdn.microsoft.com/WindowsAPICodePack

对于WPF,请使用以下内容:

下载后从http://code.msdn.microsoft.com/VistaBridge下载'VistaBridge示例库' ,打开项目然后构建它(如果要查看所有代码,请检查\ Library中的文件或\ Interop文件夹).您现在可以从VistaBridge\bin\debug \中获取DLL,并在项目中添加对它的引用,并且必须为每个不同的VistaBridge模块添加using语句.例如:

使用Microsoft.SDK.Samples.VistaBridge.Interop或.Library或.Properties或.Services - 根据您的需要.

VistaBridge项目包括用于许多其他Vista功能的API(例如TaskDialog,Vista OpenFile和SaveFile对话,当然还有Aero Glass Effects)来试用这些功能,运行VistaBridge项目.