元文件ID是不确定的

时间:2016-12-08 16:41:32

标签: c# gdi+ metafile

我们对包含元文件的报表进行了集成测试。元文件应该相同或者不能通过测试,但我们所看到的是对象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;

(entire repro)

首先运行(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,每次运行进程时它都是相同的顺序,但在实际的报告元文件中,第一个输出在两个进程运行之间永远不会相同。

为什么会发生这种情况?如何确定性地生成元文件?

0 个答案:

没有答案