Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# HRESULT异常:0x80040111(类E类不可用)_C#_.net_Wpf_Dll_Com - Fatal编程技术网

C# HRESULT异常:0x80040111(类E类不可用)

C# HRESULT异常:0x80040111(类E类不可用),c#,.net,wpf,dll,com,C#,.net,Wpf,Dll,Com,使用.NET4.0/WPF应用程序/C 我的应用程序中有以下代码,单击Select按钮时会打开一个文件对话框 OpenFileDialog fdgSelectFile; bool? dialogResult; try { fdgSelectFile = new OpenFileDialog {DefaultExt = FileDialogDefaultExt, Filter = FileDialogFilter}; dialogResult = fdgSelectFile.Sh

使用.NET4.0/WPF应用程序/C

我的应用程序中有以下代码,单击Select按钮时会打开一个文件对话框

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}

我还尝试了以下方法

根据SO的帖子,我试图注册dll,但它回来说

[窗口标题]RegSvr32

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

请确保comdlg32.dll是有效的dll或OCX文件,然后重试 再说一遍

[好的]

根据SO帖子,我尝试更改权限,但没有成功

除了重新成像机器或重新安装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

抛开Windows安装被破坏的可能性不谈,这实际上是一个相当隐蔽的问题,它是由Windows 7及更高版本中关闭视觉主题引起的

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

例如,在使用高对比度主题时,可视主题也可能在操作系统级别关闭,并且通常在终端服务会话中关闭,或者在通过WebEx或某些其他桌面共享应用程序进行桌面共享时关闭

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

在内部,OpenFileDialog的实现有一个方法,该方法尝试初始化OpenFileDialog COM控件的实例,该控件在关闭视觉主题时失败

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

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


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

有关使用System.Windows.Forms.SaveFileDialog的答案的说明;确保将属性AutoUpgradeEnabled设置为False

Windows 10中有一个高对比度模式,如果用户打开了该模式,而您没有设置此选项,则会出现此错误


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

@HansPassant,在其他机器上也可以工作。我可以从其他应用程序打开“文件打开”对话框too@HansPassant-我可以通过关闭视觉主题重现此问题-看起来OpenFileDialog和SaveFileDialog的WPF包装中有一个bug您是否从网络路径/共享运行项目?尝试将整个源代码移动/复制到C驱动器上,然后从那里运行它。可能有一些解决方法,例如使用旧的XP风格的对话框。我在一篇博文中写到了它们,当我打开“高对比度”时,在窗口10中遇到了同样的问题。当我关闭“高对比度”时,它会恢复正常。