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;
我决定对临时文件使用隔离存储:
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;