Common Language Runtime在单元测试中检测到无效的程序错误

时间:2013-01-15 07:52:11

标签: clr invalidoperationexception

我有以下代码

 this.SafeUpdate(rate, Guid.Parse(import.myGuid), c => c.myGuid);

SafeUpdate基本上采用解析的guid值并将其应用于rate对象的myGuid属性。这在我的前端工作正常,但在单元测试中运行时会抛出“CLR检测到......”错误。奇怪的是DateTime.Parse和int.Parse的相同语句工作正常。它只是Guid和小数的失败。我不相信错误与解析有关(当提取到单独的变量时它具有正确的解析值)。我不相信这是嘲弄,因为该语句适用于除guid和decimal之外的所有其他类型。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我们昨天在构建服务器上遇到了类似的错误。我们的异常是由DataContractSerializer的ReadObject()方法抛出的。

System.InvalidProgramException: Common Language Runtime detected an invalid program.
 at System.Xml.EncodingStreamWrapper..ctor(Stream stream, Encoding encoding)
 at System.Xml.XmlUTF8TextReader.SetInput(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose)
 at System.Xml.XmlDictionaryReader.CreateTextReader(Stream stream, Encoding encoding, XmlDictionaryReaderQuotas quotas, OnXmlDictionaryReaderClose onClose)
 at System.Xml.XmlDictionaryReader.CreateTextReader(Stream stream, XmlDictionaryReaderQuotas quotas)
 at System.Runtime.Serialization.XmlObjectSerializer.ReadObject(Stream stream) 

我们编写了一个控制台应用程序,只做这件事。它运行没有错误,但在简单的单元测试中失败。我们使用Gallio / MbUnit 3.4.11.0作为我们的测试框架,目标是.net 4.0。

using System;
using System.IO;
using System.Runtime.Serialization;
using MbUnit.Framework;

namespace TestApp
{
    [TestFixture]
    class Program
    {
        static void Main()
        {
            FooBar();
            Console.ReadKey();
        }

        public static void FooBar()
        {
            var type = typeof(string);
            var foo = "foo";

            using (var stream = new MemoryStream())
            {
                var serializer = new DataContractSerializer(type);
                serializer.WriteObject(stream, foo);
                stream.Seek(0, SeekOrigin.Begin);
                var deserializer = new DataContractSerializer(type);
                var bar = deserializer.ReadObject(stream);
                Console.WriteLine(bar);
            }
        }

        [Test]
        public void Test()
        {
            FooBar();
        }
    }
}

应用程序运行正常,但测试抛出。奇怪的是,这个测试在我的开发盒上传递,但在我们的构建服务器以及同事的开发盒上失败了。很明显,我的开发盒有一些不同之处允许测试通过,但我还没有找到这个区别。

更新1 我的开发箱上的System.dll版本是4.0.30319.296但是在我的同事的构建服务器和开发箱上它是4.0.30319.1001。但是,System.Xml.dll和System.Runtime.Serialization.dll在4.0.30319.1是相同的。

更新2 快速谷歌搜索“4.0.30319.1001”返回此安全更新,http://support.microsoft.com/kb/2742595,它已应用于我们的构建服务器和我的同事的开发箱,但不是我的开发箱。我在构建服务器上卸载了更新,重新启动,问题就消失了!我猜微软还没有对这个进行单元测试。 : - )