我们有一台特定的 Vista x64 机器,在运行我们的 C# WinForms 应用程序时,它显示以下错误:
System.EntryPointNotFoundException:无法在 DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点。
同样的代码在其他 Vista 机器上也能正常工作。出于某种原因,这台特定的 Vista 机器总是抛出这个异常。
我们如何解决这个问题?
我们有一台特定的 Vista x64 机器,在运行我们的 C# WinForms 应用程序时,它显示以下错误:
System.EntryPointNotFoundException:无法在 DLL“ComCtl32”中找到名为“TaskDialogIndirect”的入口点。
同样的代码在其他 Vista 机器上也能正常工作。出于某种原因,这台特定的 Vista 机器总是抛出这个异常。
我们如何解决这个问题?
我遇到了这个问题和 Naughter 的免费XTaskDialog API,通过仿真在 Windows XP 机器上获得回退机制,使这个对话框实现更加有用。:)
就我而言,这是一个激活上下文问题,如本博客条目中所述。
或者,在这里引用,以防有一天博客文章在网络空间中丢失(适用于 Visual Studio):
在步骤 4 中插入的代码:
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls"
version="6.0.0.0" processorArchitecture="*"
publicKeyToken="6595b64144ccf1df" language="*" />
</dependentAssembly>
</dependency>
我建议在工作和不工作的 Vista 机器上比较 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
Internet 存档作为原始链接已变暗 https://web.archive.org/web/20110313122806/http://support.microsoft.com/kb/830033