2015-04-28 4 views
3

с .NET 4.0/WPF Application/C#Исключение из HRESULT: 0x80040111 (CLASS_E_CLASSNOTAVAILABLE)

У меня есть следующий фрагмент кода в моем приложении, который открывает FileDialog, когда кнопка нажата 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 

Обнаружение ошибки вызвана comdlg32.dll из Microsoft.Win32 имен, внутри 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 сообщение, я пытался зарегистрировать dll, но он вернулся домой, говоря

    [Window Title] RegSvr32

    [Содержание] Был загружен модуль «comdlg32.dll», но ry-point DllRegisterServer не найден.

    Убедитесь, что «comdlg32.dll» является допустимым DLL или OCX-файлом, а затем снова попробуйте .

    [OK]

  2. По this SO сообщение, я попытался изменить 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 
+2

Это сильно намекает на сломанный Windows, установить, запустить ПФС. exe/scannow. Выполните двойную проверку, скажем, с помощью Notepad.exe и используйте File + Open. Если проблема связана только с вашей программой, тогда возникает подозрение на проблему с потоками, например, создание потока STA, который не вызывает Application.Run(). –

+1

@ HansPassant, то же самое работает и на других машинах. Я также могу открыть диалоговое окно открытия файла из других приложений –

+1

@HansPassant - я смог воспроизвести эту проблему, отключив визуальные темы - это похоже на ошибку в оболочке WPF для OpenFileDialog и SaveFileDialog –

ответ

2

Отказ от возможности, что установка Windows нарушена, на самом деле это довольно коварная проблема, вызванная тем, что «Визуальные темы» отключены в Windows 7 и выше.

Чтобы воспроизвести его, вы можете воспользоваться рабочим WPF-приложением и изменить его параметры совместимости (щелкните правой кнопкой мыши на.exe в проводнике Windows, затем выберите «Настройки» и на вкладке «Совместимость» установите флажок «Отключить визуальные темы»). Затем попробуйте запустить приложение, и вы заметите, что он начинает сбой при попытке показать OpenFileDialog или SaveFileDialog.

Визуальные темы могут быть отключены и на уровне ОС (например, при использовании темы с высокой контрастностью), и обычно они отключены в сеансах служб терминалов или при совместном использовании компьютеров через WebEx или другие приложения для совместного использования рабочего стола.

К сожалению, у меня пока нет решения, но, основываясь на чтении через MSDN, похоже, что Microsoft заявляет, что вам следует «предоставить альтернативный путь кода», когда состав рабочего стола и визуальные темы отключены - что бы это ни значило.

Внутренне, реализация в 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"))); 
} 
+0

Возможны обходные пути , например, используя старые диалоги стиля XP. Я написал о них в блоге, https://blog.lextudio.com/openfiledialog-crashes-with-comexception-0x80040111-f51e18d1ab89 –

Смежные вопросы