无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点
我们有一台特定的Vista x64机器,在运行我们的C#WinForms应用程序时,会显示以下错误:
System.EntryPointNotFoundException:无法在DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点。
这个代码在其他Vista机器上运行正常。 出于某种原因,这台特殊的Vista机器总是抛出这个例外。
我们该如何解决这个问题?
我有这个问题和Naughter的免费XTaskDialog API ,通过仿真在Windows XP机器上获得回退机制,使这个对话框实现更加有用。 🙂
就我而言,这是一个激活上下文问题,如本博客文章中所述 。
或者,引用这里,以防博客文章有一天在网络空间丢失(适用于Visual Studio):
- 在解决方案资源管理器中打开项目属性,
- 在“安全”选项卡上,选中“启用ClickOnce安全设置”,
- 现在您可以看到在解决方案的Properties文件夹中显示app.manifest文件,打开它,
- 在 trustInfo>标记下面,插入下面的代码。
- 如果您尝试构建,则可能存在错误。 要解决此问题,请取消选中“启用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