【发布时间】: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}
我也尝试了以下
-
根据this SO Post,我尝试注册
dll,但它回来说[窗口标题] RegSvr32
[内容] 模块“comdlg32.dll”已加载,但入口点 找不到 DllRegisterServer。
确保“comdlg32.dll”是有效的 DLL 或 OCX 文件,然后尝试 再次。
[确定]
根据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 驱动器并从那里运行它。