资源查找期间的 C# 无限递归
C# infinite recursion during resource lookup
我对这段代码有疑问:
if (_updater.IsNewVersionAvailable())
{
_isolatedStorageFile.CreateDirectory("Folder");
_isolatedStorageFile.CreateDirectory("Folder2");
foreach (string file in Directory.GetFiles(_sharedFilesFolder + "\Folder"))
{
string fileName = Path.GetFileName(file);
//_isolatedStorageFile.CreateFile(fileName); // <- same problem
using (var outputStream = _isolatedStorageFile.OpenFile("Folder/" + fileName, FileMode.Create, FileAccess.Write)) // <- here is the problem (I tried with backslash (\) and also doesnt work.
{
using (var inputStream = File.OpenRead(file))
{
inputStream.CopyTo(outputStream);
}
}
}
}
当我 运行 调用这段代码的 MS 测试时,我得到这个错误:
error1
error2
隔离存储里面的文件夹创建正常(无法创建文件)
最奇怪的是,有一次当我开始测试时,文件已经创建 - 它是 1/20 运行s.
有什么想法吗?
你可以尝试的一件事是,在你遇到无限递归问题之前将它插入你的代码中(来自 here and here):
try
{
throw new NotImplementedException();
}
catch (NotImplementedException ex)
{
}
我只是想找出一个问题,我们打算从独立存储中检索一些东西,但它卡在了这个 inf 递归中。我正在浏览 .Net 和 MSTest 源,似乎是:
- 文件不存在。它试图从 FileStream.Init > WinIOError.
中抛出 FileNotFoundException
- 要抛出异常,它会尝试获取带有 Environment.GetResourceString("IO.FileNotFound_FileName", str), str) 的字符串。从那里您可以使用诸如 InternalGetSatelliteAssembly 之类的函数。它正在尝试定位 mscorlib。
- 同时,MSTest 定义了一个 AssemblyResolver 侦听器,此时将调用它。它将遍历某些路径,对它们进行 File.Exists 检查。
- File.Exist 将检查对该文件的权限。对于代码访问权限,它将抛出带有参数的 SecurityException:Environment.GetResourceString("Security_Generic").
- 循环回到第 2 点。
- (IsolatedStorage 永远不会捕获 FileNotFoundException,因此它不会创建新的异常。)
NotImplementedException 或 AgrumentException 似乎强制加载 mscorlib,避免了循环。不过,也许还有另一种方法可以让它更容易找到。
在我的例子中,当我的代码试图在 IsolatedStorage
中创建一个 new 文件时,在某些机器上 确实发生了这种情况].经过一些研究,它似乎确实是一个错误,并且在机器设置了 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;
我对这段代码有疑问:
if (_updater.IsNewVersionAvailable())
{
_isolatedStorageFile.CreateDirectory("Folder");
_isolatedStorageFile.CreateDirectory("Folder2");
foreach (string file in Directory.GetFiles(_sharedFilesFolder + "\Folder"))
{
string fileName = Path.GetFileName(file);
//_isolatedStorageFile.CreateFile(fileName); // <- same problem
using (var outputStream = _isolatedStorageFile.OpenFile("Folder/" + fileName, FileMode.Create, FileAccess.Write)) // <- here is the problem (I tried with backslash (\) and also doesnt work.
{
using (var inputStream = File.OpenRead(file))
{
inputStream.CopyTo(outputStream);
}
}
}
}
当我 运行 调用这段代码的 MS 测试时,我得到这个错误:
error1
error2
隔离存储里面的文件夹创建正常(无法创建文件) 最奇怪的是,有一次当我开始测试时,文件已经创建 - 它是 1/20 运行s.
有什么想法吗?
你可以尝试的一件事是,在你遇到无限递归问题之前将它插入你的代码中(来自 here and here):
try
{
throw new NotImplementedException();
}
catch (NotImplementedException ex)
{
}
我只是想找出一个问题,我们打算从独立存储中检索一些东西,但它卡在了这个 inf 递归中。我正在浏览 .Net 和 MSTest 源,似乎是:
- 文件不存在。它试图从 FileStream.Init > WinIOError. 中抛出 FileNotFoundException
- 要抛出异常,它会尝试获取带有 Environment.GetResourceString("IO.FileNotFound_FileName", str), str) 的字符串。从那里您可以使用诸如 InternalGetSatelliteAssembly 之类的函数。它正在尝试定位 mscorlib。
- 同时,MSTest 定义了一个 AssemblyResolver 侦听器,此时将调用它。它将遍历某些路径,对它们进行 File.Exists 检查。
- File.Exist 将检查对该文件的权限。对于代码访问权限,它将抛出带有参数的 SecurityException:Environment.GetResourceString("Security_Generic").
- 循环回到第 2 点。
- (IsolatedStorage 永远不会捕获 FileNotFoundException,因此它不会创建新的异常。)
NotImplementedException 或 AgrumentException 似乎强制加载 mscorlib,避免了循环。不过,也许还有另一种方法可以让它更容易找到。
在我的例子中,当我的代码试图在 IsolatedStorage
中创建一个 new 文件时,在某些机器上 确实发生了这种情况].经过一些研究,它似乎确实是一个错误,并且在机器设置了 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;