C# HRESULT异常:0x80040111(类E类不可用)
使用.NET4.0/WPF应用程序/C 我的应用程序中有以下代码,单击Select按钮时会打开一个文件对话框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
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中遇到了同样的问题。当我关闭“高对比度”时,它会恢复正常。