来自HRESULT的异常:0x80040111(CLASS_E_CLASSNOTAVAILABLE)

时间:2015-04-28 21:02:07

标签: c# .net wpf dll com

使用.Net 4.0 / WPF Application / 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

查找错误是由comdlg32.dll命名空间Microsoft.Win32 PresentationFramework.dll内部reg query HKCR\CLSID | find /i "{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}" 程序集引起的,我查询了此CLS ID的注册表

dll

这就是它所说的

  

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

我也尝试了以下

  1. 根据this SO帖子,我尝试注册Permissions,但它回来了说

      

    [窗口标题] RegSvr32

         

    [内容]模块" comdlg32.dll"装载但是入口点   找不到DllRegisterServer。

         

    确保" comdlg32.dll"是一个有效的DLL或OCX文件,然后尝试   试。

         

    [OK]

  2. 根据this SO帖子,我尝试更改PresentationFramework.dll,但没有运气

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

    如果这有帮助:我有.Net FrameWork v3.5 / v4.0 / v4.5.1& v4.5.2安装在我的机器中,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 在文件夹内的所有位置都可用

    matlab

3 个答案:

答案 0 :(得分:4)

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

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

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

不幸的是我还没有解决方案,但基于通过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")));
}

答案 1 :(得分:0)

使用SaveFileDialog时遇到相同的问题。

确保使用System.Windows.Forms.SaveFileDialog,并 Microsoft.Win32.SaveFileDialog

答案 2 :(得分:0)

关于使用System.Windows.Forms.SaveFileDialog答案的答案的注释;确保设置属性.AutoUpgradeEnabled = False。 Windows 10中有一个高对比度模式,如果在用户启用此模式时未设置此选项,则会出现此错误。该控件看起来就像Windows XP一样,但至少仍然可以使用。