昨天我們在構建服務器上遇到了類似的錯誤。我們的異常是由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日以後。 –