我们对包含元文件的报表进行了集成测试。元文件应该相同或者不能通过测试,但我们所看到的是对象ID号(对于笔,区域和字符串格式)似乎在某个点之后变得随机化:
var entireRect = new Rectangle(0, 0, 100, 100);
var metafile = CreateMetafileInstance(entireRect, MetafileFrameUnit.Pixel, EmfType.EmfPlusOnly);
using (var g = Graphics.FromImage(metafile))
{
for (var times = 0; times < 2; times++)
{
using (var region = new Region(entireRect))
g.FillRegion(Brushes.Black, region);
using (var pen = new Pen(Color.Black))
g.DrawRectangle(pen, entireRect);
}
}
return metafile;
首先运行(full):
对象,id 0,类型Region,Rect(x:0,y:0,width:100,height:100)
FillRegion,区域ID 0,颜色#FF000000
对象,id 0 ,键入Pen,[...]
DrawRects,笔标识 0 :( x:0,y:0,宽度:100,高度:100)
对象,id 1 ,类型为Region,Rect(x:0,y:0,width:100,height:100)
FillRegion,区域ID 1 ,颜色#FF000000
对象,id 0 ,键入Pen,[...]
DrawRects,笔ID 0 :( x:0,y:0,宽度:100,高度:100)
第二轮(full):
对象,id 0,类型Region,Rect(x:0,y:0,width:100,height:100)
FillRegion,区域ID 0,颜色#FF000000
对象,id 1 ,输入Pen,[...]
DrawRects,笔ID 1 :( x:0,y:0,宽度:100,高度:100)
对象,id 0 ,类型为Region,Rect(x:0,y:0,width:100,height:100)
FillRegion,区域ID 0 ,颜色#FF000000
对象,id 1 ,输入Pen,[...]
DrawRects,笔ID 1 :( x:0,y:0,宽度:100,高度:100)
这是我能找到的最简单的复制品。所有后续运行似乎都稳定为第二个版本。但是,在实际的报告元文件中,我从未在六次相同的运行中看到任何相同的输出。
我尝试了不同的/相同的设备上下文,不同/相同的线程,我无法想到任何其他尝试。使用这个repro,每次运行进程时它都是相同的顺序,但在实际的报告元文件中,第一个输出在两个进程运行之间永远不会相同。
为什么会发生这种情况?如何确定性地生成元文件?