【问题标题】:"Method failed with unexpected error code 3" when storing app user settings存储应用程序用户设置时出现“方法失败,出现意外错误代码 3”
【发布时间】:2013-10-01 08:29:27
【问题描述】:

我目前正在开发一个 Internet Explorer BHO,它使用 Add-In Express (www.add-in-express.com) .NET 库在 VB.NET 中编写并针对 .NET Framework 2.0。浏览器插件通过 InnoSetup 5 安装程序安装到用户的 AppData/Local 目录,该安装程序还处理插件的注册。

在安装时,InnoSetup 安装程序是 UAC 提升的,这是向浏览器注册 BHO 的可执行文件(由 Add-In Express 提供)所必需的。

我必须指出,我的 .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 多个用户群的旧版本的更新。我们的用户涵盖了一系列技能水平,并且该插件应该在多个操作系统和用户设置中“按原样”运行。

【问题讨论】:

  • Windows 错误 3 是“找不到路径”。当 EXE 不是 .NET 程序时,您不能使用应用程序设置。
  • 嗨,汉斯。 dll 程序集确实是一个 .NET 应用程序(旨在使用 .NET Framework 2.0)。我知道它无法在它正在查看的位置找到 user.config,因为它不存在。我的问题是我不明白为什么它没有创建 user.config 文件,我认为这应该是大多数利用 Visual Studio 的 MySettings 功能的 .NET 应用程序的本机行为?

标签: .net vb.net internet-explorer add-in bho


【解决方案1】:

确保您已在安装包中包含插件的配置文件。

此外,如果启用了 Internet Explorer 保护模式,您的代码将无法将任何内容保存到位于安装插件的同一文件夹中的配置文件中。您可以实现自定义配置文件并将其复制到用户配置文件中的“Temporary Internet Files\Low”文件夹。另一种解决方案是禁用保护模式。

【讨论】:

  • 感谢您的回复德米特里。我确实包含了 xxx.dll.config 但我不确定我是否应该对它做任何特别的事情,而不是将它放在与 dll 相同的位置?由于我们使用的是自定义库(Add-In Express),我们使用的是他们自己的自定义加载器(adxloader.dll)和注册器(adxregistrator.dll),我不确定这些是否接受附加参数.按照我的理解,应用程序应该自动在 AppData/Local 文件夹中创建 company/assembly/randomhash/version/user.config 文件?
  • Gary,当 Internet Explorer 保护模式打开时,您的代码无法写入 AppData\Local 文件夹。启用保护模式后,IE 插件只能写入用户配置文件下的几个目录。在 Temp、Temporary Internet Files、Cookies 和 Favorites 目录下有特殊的低完整性目录是可写的:blogs.msdn.com/b/ie/archive/2006/02/09/528963.aspx
【解决方案2】:

您是否尝试以管理员身份运行应用程序?

当您右键单击应用程序并查看可用选项时,您可以查看它,该选项会显示为“以管理员身份运行”。

【讨论】:

  • 感谢您的快速回复。我可以在管理模式下运行 IE,但不幸的是,这个插件将发布给当前超过 20,000 人的用户群 - 所以它不是一个真正的选择,因为插件需要“按原样”在多个电脑配置。
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
相关资源
最近更新 更多