IsolatedStorageFileStream 导致断言失败

IsolatedStorageFileStream lead to assert failure

我决定对临时文件使用隔离存储:

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForDomain())
{
    using (IsolatedStorageFileStream userStream = new IsolatedStorageFileStream("UserSettings.set", FileMode.Create, isoStore))
    {

    }
}

我从示例中提取了此代码,该代码在这台计算机上有效。仅此代码的最小项目也成功运行。

但是在我当前的项目中执行 IsolatedStorageFileStream 构造函数时出现以下消息:

MyApp.exe - Assert Failure

Expression: [mscorlib recursive resource lookup bug]

Desctiprion: Infinite recurion during resource lookup within mscorlib. This may be a bug in mscorlib, or potentially in certain extensibility points such as assembly resolve events or CultureInfo names.

Resource name: Serurity_Generic

并且在这条消息中我可以看到相当大的堆栈跟踪(它从 IsolatedStorageFileStream 构造函数的调用开始):

我也无法从这段代码中捕捉到异常。

看起来 System.Environment.ResourceHelper.GetResourceStringCode() 中发生了错误。

这可能是什么原因?我找不到关于这个主题的任何内容。

删除 C:\Users\user\AppData\Local\IsolatedStorage 文件夹无法解决问题(我确定只有我的文件夹)。

查看堆栈跟踪,基本问题来自 LongPathFile.GetLength。路径中可能存在一些无效字符,或者可能存在权限问题。没有确切的错误代码很难说。 然后,.NET 尝试加载与错误代码相关的错误消息,并在某些时候进入 Costura.AssemblyLoader(这必须是您的代码或您正在引用的某些库)。看起来 AssemblyLoader 订阅了 AssemblyResolve 事件,并且在获取正确的程序集方面做得很差,因为它实际上会导致无限递归。

简而言之:修复那个程序集加载器,然后你就能得到真正的错误。

在我的例子中,当我的代码试图在 IsolatedStorage 中创建一个 new 文件时,在某些机器上 确实发生了这种情况].正如 InfernumDeus 的评论中正确提到的那样,只有当机器设置了 non-English 活动语言环境时才会发生。以下代码解决了我的问题:

var currentCulture = Thread.CurrentThread.CurrentCulture;
var currentUiCulture = Thread.CurrentThread.CurrentUICulture;

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

var traceFileStream = new IsolatedStorageFileStream("system_log.txt", FileMode.OpenOrCreate, FileAccess.Write);

Thread.CurrentThread.CurrentCulture = currentCulture;
Thread.CurrentThread.CurrentUICulture = currentUiCulture;