0

编辑:仅供未来读者参考,从 BitMiracle 的 LibTiff.NET 版本 2.3.606.0 开始,此问题已得到修复。

我在我的 C# 库(在 .NET 3.5 | x86 编译)中使用 BitMiracle 的 LibTiff.NET(版本 2.3.605.0 及更低版本),并在我调用时不断收到此异常ReadDirectorySystem.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;
    }

编辑:好的,经过进一步测试,我有更多信息,这仅在我运行单元测试时发生!不知道为什么这会改变任何事情。

4

1 回答 1

2

由于其他线程谈论单元测试并在尝试写入控制台时遇到同样的错误(输出到控制台时出现 ObjectDisposedException),我意识到 LibTiff.NET 库正在尝试写入错误控制台。看了下源码,发现这段代码:

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

因为他们在一次使用中包装了所有对错误的写入,所以它在第一次写入错误后处理了 Console.Error 对象。这在第二次引起了我的错误(ReadDirectory 做了在链表上调用 Next 所做的事情)。所以我删除了使用,问题就解决了!

        TextWriter stderr = Console.Error;
        ...

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

我问了另一个问题,为什么他们曾被允许在单元测试中处理标准输出,但在其他情况下却不允许:.NET - 为什么只在单元测试期间允许处理标准输出?. 如果您对该问题有任何答案...请在此处发布。

于 2012-08-24T21:50:13.033 回答