无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点

我们有一台特定的Vista x64机器,在运行我们的C#WinForms应用程序时,会显示以下错误:

System.EntryPointNotFoundException:无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点。

这个代码在其他Vista机器上运行正常。 出于某种原因,这台特殊的Vista机器总是抛出这个例外。

我们该如何解决这个问题?

我有这个问题和Naughter的免费XTaskDialog API ,通过仿真在Windows XP机器上获得回退机制,使这个对话框实现更加有用。 🙂

就我而言,这是一个激活上下文问题,如本博客文章中所述 。

或者,引用这里,以防博客文章有一天在网络空间丢失(适用于Visual Studio):

  1. 在解决方案资源管理器中打开项目属性,
  2. 在“安全”选项卡上,选中“启用ClickOnce安全设置”,
  3. 现在您可以看到在解决方案的Properties文件夹中显示app.manifest文件,打开它,
  4. 标记下面,插入下面的代码。
  5. 如果您尝试构建,则可能存在错误。 要解决此问题,请取消选中“启用ClickOnce安全设置”。

要在第4步中插入的代码:

     

我建议比较工作和非工作Vista机器上的comctl32.dll版本 – 并比较它们的校验和,即使它们报告相同的版本。

其他要检查的事项:

  • 非工作机器是否有预发布版本的Vista?
  • 是否有可能将非Vista版本的comctl32.dll复制到计算机上并被应用程序接收? (Visual Studio附带的Depends实用程序可能会有所帮助。)
  • 病毒或蠕虫(或不是)可能已经取代了comctl32.dll吗?

也许值得阅读关于激活上下文的这篇文章 。

如果您用于运行该程序的其他计算机使用的是Vista x86,则可能是您的代码中存在导致该问题的PInvoke。 您可能想尝试将编译器目标体系结构设置为x86,以强制您的程序在x64 Vista上的WoW64中运行。 默认情况下,Visual Studio使用与体系结构无关的方式构建程序集。 这意味着当您尝试在64位系统上运行.NET程序时,它应该由CLR的本机x64版本托管。 尝试在该上下文中加载32位DLL将失败。 相反,强制应用程序在模拟x86模式下运行应该可以解决问题。

今天有这个问题与ClickOnce应用程序。

唯一有效的是这个解决方案: http : //support.microsoft.com/kb/830033