Сбой метода с неожиданным кодом ошибки 3 при сохранении пользовательских настроек приложения

В настоящее время я работаю над Internet Explorer BHO, который был написан на VB.NET с использованием библиотеки Add-In Express (www.add-in-express.com) .NET и нацелен на .NET Framework 2.0. Надстройка браузера устанавливается в каталог пользователя AppData/Local с помощью установщика InnoSetup 5, который также обрабатывает регистрацию надстройки.

После установки установщик InnoSetup имеет повышенный уровень контроля учетных записей, что требуется для исполняемого файла (предоставляемого надстройкой Express), который регистрирует BHO в браузере.

Я должен отметить, что мой опыт работы с .NET в лучшем случае минимален — я знаю достаточно, чтобы кодировать приложение, но на самом деле не знаю, как операционная система взаимодействует с приложениями — я постараюсь описать проблему как можно лучше. Я могу.

Одной из функций, которую использует мое дополнение, являются пользовательские настройки Visual Studio (через раздел «Свойства-> Настройки» в VS). При отладке надстройки в IE на исходной машине все работает как положено.

При установке надстройки на новую машину я получаю исключение всякий раз, когда мое приложение пытается вызвать My.Settings.Save(). Я изо всех сил пытался найти в Интернете другие идентичные сценарии для этой же проблемы. Пожалуйста, найдите трассировку стека ниже:

Exception Source:      mscorlib
Exception Type:        System.InvalidOperationException
Exception Message:     Method failed with unexpected error code 3.
Exception Target Site: CreateInternal

---- Stack Trace ----
   System.Security.AccessControl.NativeObjectSecurity.CreateInternal(resourceType As ResourceType, isContainer As Boolean, name As String, handle As SafeHandle, includeSections As AccessControlSections, createByName As Boolean, exceptionFromErrorCode As ExceptionFromErrorCode, exceptionContext As Object)
       mscorlib.dll: N 0306 (0x132) IL 
   System.Security.AccessControl.FileSystemSecurity..ctor(isContainer As Boolean, name As String, includeSections As AccessControlSections, isDirectory As Boolean)
       mscorlib.dll: N 0017 (0x11) IL 
   System.Security.AccessControl.FileSecurity..ctor(fileName As String, includeSections As AccessControlSections)
       mscorlib.dll: N 0000 (0x0) IL 
   System.Configuration.Internal.WriteFileContext.DuplicateTemplateAttributes(source As String, destination As String)
       mscorlib.dll: N 0008 (0x8) IL 
   System.Configuration.Internal.WriteFileContext.DuplicateFileAttributes(source As String, destination As String)
       mscorlib.dll: N 0028 (0x1C) IL 
   System.Configuration.Internal.WriteFileContext.Complete(filename As String, success As Boolean)
       mscorlib.dll: N 0018 (0x12) IL 
   System.Configuration.Internal.InternalConfigHost.StaticWriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
       mscorlib.dll: N 0070 (0x46) IL 
   System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
       mscorlib.dll: N 0000 (0x0) IL 
   System.Configuration.Internal.DelegatingConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object, assertPermissions As Boolean)
       mscorlib.dll: N 0000 (0x0) IL 
   System.Configuration.ClientSettingsConfigurationHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object)
       mscorlib.dll: N 0019 (0x13) IL 
   System.Configuration.UpdateConfigHost.WriteCompleted(streamName As String, success As Boolean, writeContext As Object)
       mscorlib.dll: N 0036 (0x24) IL 
   System.Configuration.MgmtConfigurationRecord.SaveAs(filename As String, saveMode As ConfigurationSaveMode, forceUpdateAll As Boolean)
       mscorlib.dll: N 0793 (0x319) IL 
   System.Configuration.Configuration.SaveAsImpl(filename As String, saveMode As ConfigurationSaveMode, forceSaveAll As Boolean)
       mscorlib.dll: N 0036 (0x24) IL 
   System.Configuration.Configuration.Save()
       mscorlib.dll: N 0000 (0x0) IL 
   System.Configuration.ClientSettingsStore.WriteSettings(sectionName As String, isRoaming As Boolean, newSettings As IDictionary)
       mscorlib.dll: N 0219 (0xDB) IL 
   System.Configuration.LocalFileSettingsProvider.SetPropertyValues(context As SettingsContext, values As SettingsPropertyValueCollection)
       mscorlib.dll: N 0219 (0xDB) IL 
   System.Configuration.SettingsBase.SaveCore()
       mscorlib.dll: N 0154 (0x9A) IL 
   System.Configuration.SettingsBase.Save()
       mscorlib.dll: N 0016 (0x10) IL 
   System.Configuration.ApplicationSettingsBase.Save()
       mscorlib.dll: N 0023 (0x17) IL 
   FindAndRemind.User.DetectUser()
       mscorlib.dll: N 0042 (0x2A) IL 
   FindAndRemind.IEModule.IEModule_DownloadComplete()
       mscorlib.dll: N 0151 (0x97) IL 
   AddinExpress.IE.ADXIEModule.DoDownloadComplete()
       mscorlib.dll: N 0010 (0xA) IL

При поиске в каталоге User/AppData я вижу, что для имени организации не было создано папки. Я также читал, что файл user.config может быть создан самим Internet Explorer в папке Microsoft_Corporation, хотя он тоже пуст. Мне кажется, что это проблема с разрешениями, но я в недоумении из-за отсутствия у меня опыта кодирования приложений для Windows.

Кто-нибудь сталкивался с этой проблемой раньше, и если да, то как вы ее решили?

Заранее спасибо!

ИЗМЕНИТЬ:

Я также должен отметить, что исключение можно закрыть, и приложение может продолжать работать, однако данные настроек никогда не сохраняются, что делает мое дополнение немного избыточным по своей природе.

РЕДАКТИРОВАТЬ 2:

К сожалению, запуск Internet Explorer в режиме администратора невозможен, поскольку надстройка представляет собой обновление более старой версии, которая в настоящее время имеет более 20 000 пользователей. Наши пользователи имеют разный уровень квалификации, и надстройка должна работать «как есть» в различных операционных системах и пользовательских настройках.


person Razor    schedule 01.10.2013    source источник
comment
Ошибка Windows 3: Путь не найден. Вы не можете использовать настройки приложения, если EXE не является программой .NET.   -  person Hans Passant    schedule 01.10.2013
comment
Привет Ганс. Сборка dll действительно является приложением .NET (предназначенным для использования .NET Framework 2.0). Я понимаю, что он не может найти файл user.config в том месте, где он просматривается, поскольку он не существует. Моя проблема в том, что я не понимаю, почему он не создает файл user.config, который, как я считаю, должен быть естественным поведением для большинства приложений .NET, которые используют функциональные возможности Visual Studio MySettings?   -  person Razor    schedule 02.10.2013


Ответы (2)


Убедитесь, что вы включили файл конфигурации надстройки в свой установочный пакет.

Кроме того, если включен защищенный режим Internet Explorer, ваш код не может ничего сохранять в файл конфигурации, расположенный в той же папке, где установлено дополнение. Вы можете реализовать собственный файл конфигурации и скопировать его в папку «Temporary Internet Files\Low» в профиле пользователя. Другое решение — отключить защищенный режим.

person Dmitry Kostochko    schedule 01.10.2013
comment
Спасибо за ответ Дмитрий. Я действительно включил xxx.dll.config, но я не уверен, должен ли я делать с ним что-то особенное, кроме как хранить его в том же месте, что и dll? Из-за того, что мы используем пользовательскую библиотеку (Add-In Express), мы используем их собственный пользовательский загрузчик (adxloader.dll) и регистратор (adxregistrator.dll), и я не уверен, что они принимают дополнительные параметры. . Как я понял, приложения должны автоматически создавать файлы company/assembly/randomhash/version/user.config в папке AppData/Local? - person Razor; 02.10.2013
comment
Гэри, ваш код не может записывать в папку AppData\Local, когда включен защищенный режим Internet Explorer. Когда включен защищенный режим, надстройка IE может записывать только в несколько каталогов в профиле пользователя. В каталогах Temp, Temporary Internet Files, Cookies и Favorites есть специальные каталоги с низким уровнем целостности, доступные для записи: blogs.msdn.com/b/ie/archive/2006/02/09/528963.aspx - person Dmitry Kostochko; 03.10.2013

Вы пробовали запускать приложение от имени администратора?

Вы можете просмотреть это, щелкнув правой кнопкой мыши приложение и увидев доступные параметры, которые будут указаны как «Запуск от имени администратора».

person JGAB    schedule 01.10.2013
comment
Спасибо за ваш быстрый ответ. Я могу запустить IE в режиме администрирования, но, к сожалению, это дополнение будет выпущено для текущей пользовательской базы, насчитывающей более 20 000 человек, так что это не вариант, поскольку надстройка должна работать на нескольких конфигурациях ПК. . - person Razor; 01.10.2013