资源查找期间的 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 源,似乎是:

  1. 文件不存在。它试图从 FileStream.Init > WinIOError.
  2. 中抛出 FileNotFoundException
  3. 要抛出异常,它会尝试获取带有 Environment.GetResourceString("IO.FileNotFound_FileName", str), str) 的字符串。从那里您可以使用诸如 InternalGetSatelliteAssembly 之类的函数。它正在尝试定位 mscorlib。
  4. 同时,MSTest 定义了一个 AssemblyResolver 侦听器,此时将调用它。它将遍历某些路径,对它们进行 File.Exists 检查。
  5. File.Exist 将检查对该文件的权限。对于代码访问权限,它将抛出带有参数的 SecurityException:Environment.GetResourceString("Security_Generic").
  6. 循环回到第 2 点。
  7. (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;