【问题标题】:Exception from HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)HRESULT 异常:0x80040111 (CLASS_E_CLASSNOTAVAILABLE)
【发布时间】:2015-07-07 22:05:04
【问题描述】:

使用 .Net 4.0 / WPF 应用程序 / C#

我的应用程序中有以下代码,当单击Select 按钮时,它会打开一个 FileDialog。

OpenFileDialog fdgSelectFile;
bool? dialogResult;

try
{
    fdgSelectFile = new OpenFileDialog {DefaultExt = FileDialogDefaultExt, Filter = FileDialogFilter};
    dialogResult = fdgSelectFile.ShowDialog();
    if (dialogResult.HasValue && dialogResult.Value)
    {
        SelectedFilePath = fdgSelectFile.FileName;
        // do your stuff
    }
}

这段代码在其他机器上工作,但在我的机器上不行。它只是在单击 Select 按钮时引发异常 - 如下所示。

2015-04-28 14:33:47,453 [1] ERROR XXXX.XXXX.XXXX.ViewModels.UploadViewModel - SelectFile - System.Runtime.InteropServices.COMException (0x80040111): Creating an instance of the COM component with CLSID {DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7} from the IClassFactory failed due to the following error: 80040111 ClassFactory cannot supply requested class (Exception from HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)).
   at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
   at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark)
   at System.Activator.CreateInstance(Type type, Boolean nonPublic)
   at System.Activator.CreateInstance(Type type)
   at Microsoft.Win32.OpenFileDialog.CreateVistaDialog()
   at Microsoft.Win32.FileDialog.RunVistaDialog(IntPtr hwndOwner)
   at Microsoft.Win32.FileDialog.RunDialog(IntPtr hwndOwner)
   at Microsoft.Win32.CommonDialog.ShowDialog()
   at XXXX.XXXX.XXXX.ViewModels.UploadViewModel.SelectFile(Object param) in c:\XXXX\XXXX\Client\XXXX.XXXX.XXXX\ViewModels\UploadViewModel .cs:line 176

发现错误是由Microsoft.Win32命名空间中的comdlg32.dll引起的,在PresentationFramework.dll程序集中,我在注册表中查询了这个CLS ID

reg query HKCR\CLSID | find /i "{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}"

这就是它所说的

HKEY_CLASSES_ROOT\CLSID{DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7}


我也尝试了以下

  1. 根据this SO Post,我尝试注册dll,但它回来说

    [窗口标题] RegSvr32

    [内容] 模块“comdlg32.dll”已加载,但入口点 找不到 DllRegisterServer。

    确保“comdlg32.dll”是有效的 DLL 或 OCX 文件,然后尝试 再次。

    [确定]

  2. 根据this SO Post,我尝试更改Permissions,但没有成功


除了重新映像机器或重新安装 Windows 之外,还有什么办法可以解决这个问题?

如果这有帮助:我的机器上安装了 .Net FrameWork v3.5/v4.0/v4.5.1 和 v4.5.2,并且文件夹内的所有位置都可以使用 PresentationFramework.dll

v3.5   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v3.5\Profile\Client
v4.0   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0
v4.5   : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5
v4.5.1 : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1
v4.5.2 : C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2

【问题讨论】:

  • @HansPassant,同样的事情也适用于其他机器。我也可以从其他应用程序打开文件打开对话框
  • @HansPassant - 我能够通过关闭视觉主题来重现这个问题 - 它看起来像是 OpenFileDialog 和 SaveFileDialog 的 WPF 包装器中的一个错误
  • 您是否从网络路径/共享运行您的项目?尝试将整个源代码移动/复制到 C 驱动器并从那里运行它。

标签: c# .net wpf dll com


【解决方案1】:

排除Windows安装被破坏的可能性,这实际上是一个相当隐蔽的问题,是由Windows 7及更高版本中关闭“视觉主题”引起的。

要重现它,您可以使用一个正常工作的 WPF 应用程序并修改它的兼容性设置(在 Windows 资源管理器中右键单击 .exe,然后选择首选项并从兼容性选项卡中选中“禁用视觉主题”)。然后,尝试运行应用程序,当您尝试显示 OpenFileDialog 或 SaveFileDialog 时,您会注意到它开始崩溃。

视觉主题也可以在操作系统级别关闭(例如,当使用高对比度主题时),它们通常在终端服务会话中关闭,或者在通过 WebEx 或其他一些桌面共享应用程序共享桌面时关闭。

不幸的是,我还没有解决方案,但根据阅读 MSDN,微软似乎在说,当桌面组合和视觉主题关闭时,你应该“提供替代代码路径”——不管这意味着什么。

在内部,OpenFileDialog 的实现有一个方法尝试初始化打开文件对话框 COM 控件的实例,当 Visual Themes 关闭时失败

[SecurityCritical, SecurityTreatAsSafe]
internal override IFileDialog CreateVistaDialog()
{
    new SecurityPermission(PermissionState.Unrestricted).Assert();
    return (IFileDialog) Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("DC1C5A9C-E88A-4dde-A5A1-60F82A20AEF7")));
}

【讨论】:

  • 有一些变通方法,例如使用旧的 XP 样式对话框。我在一篇博文中写到了它们,blog.lextudio.com/…
  • 打开“高对比度”时,我在窗口 10 中遇到了同样的问题。当我关闭“高对比度”时,它恢复正常。
【解决方案2】:

我在使用 SaveFileDialog 时遇到了同样的问题。

确保使用System.Windows.Forms.SaveFileDialog,而不要使用Microsoft.Win32.SaveFileDialog

【讨论】:

    【解决方案3】:

    使用System.Windows.Forms.SaveFileDialog的答案说明;请务必设置属性AutoUpgradeEnabled = False

    Windows 10 中有一个高对比度模式,如果用户打开了它而你没有设置这个选项,你会得到这个错误。

    警告:该控件看起来像 Windows XP 中的控件,但至少它仍然可以工作。

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 2012-07-21
      • 2011-03-02
      • 2012-02-26
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多