LibTiff.NET ReadDirectory仅在unit testing期间提供System.ObjectDisposedException

编辑:对于未来读者的FYI,这个问题已经修复,从BitMiracle的LibTiff.NET版本2.3.606.0开始。

我在我的C#库(在.NET 3.5 | x86中编译)中使用BitMiracle的LibTiff.NET(版本2.3.605.0及更低版本)并在调用ReadDirectory时不断收到此exception: System.ObjectDisposedException: Cannot write to a closed TextWriter

我意识到这似乎表明我在打电话之前已经处理了我的图像……但我没有特别这样做。 这是图书馆里的一个错误,还是我真的错过了什么?

这是我的代码:

  public static bool IsTiffBiTonal(String tiffFilePath) { VerifyFileExistence(tiffFilePath); using (Tiff tiff = Tiff.Open(tiffFilePath, "r")) { do { if (tiff.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt() == 1) { continue; } return false; } while (tiff.ReadDirectory()); //Error occurs here } return true; } 

编辑:好的,经过一些进一步的测试后我得到了更多信息,这只是在我运行我的unit testing时才发生的! 不知道为什么会改变任何东西。

由于其他线程在讨论unit testing并在尝试写入控制台时遇到同样的错误( 输出到控制台时出现ObjectDisposedException ),我意识到LibTiff.NET库试图写入错误控制台。 浏览完源代码后,我发现这段代码:

  using (TextWriter stderr = Console.Error) { ... } 

因为它们在使用中将所有写入包装到错误中,所以它在第一次写入错误输出后处理了Console.Error对象。 这导致我第二次出错(ReadDirectory执行链接列表上调用Next的操作)。 所以我删除了使用,问题得到解决!

  TextWriter stderr = Console.Error; ... 

所以,这里的教训是:不要处理你的标准输出:)

我问过另一个问题,为什么他们被允许在unit testing中处理标准输出而不是在其他情况下处理 : .NET – 为什么在unit testing期间只允许处理标准输出? 。 如果您对问题有任何答案,请将其发布在那里。