昨天我们在构建服务器上遇到了类似的错误。我们的异常是由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中对我的dev的盒子的版本是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,这是应用到我们构建服务器和我的同事的开发中,但不是我开发框。我卸载了构建服务器上的更新,重新启动,问题就消失了!我想微软还没有针对这个问题进行单元测试。 :-)
哪个单元测试框架? –
你可以添加堆栈跟踪吗?我可能会遇到类似的问题,但仅限于1月10日以后。 –