Well done! :) Just as a side note, you could use BitConverter.ToString() when stringifying the md5 hash instead of that ugly loop using StringBuilder.
2011/6/18 Florian <[email protected]> > Hi everybody, > > well I got it working - thanks to JBs for commenting the field > positions in ImageReader. > In case anybody needs the same really urgently it may be helpfull so I > am posting it here: > > Addtional code in class ModuleDefinition: > > public int TimeDateStampPosition { get { return > Image.TimeDateStampPosition; } } > public int FileChecksumPosition { get { return > Image.FileChecksumPosition; } } > > public string GetBuildIndependentHash() > { > var byteArray = File.ReadAllBytes(Image.FileName); > > //overwrite parts of the assembly file content byte array > //(only in memory of course) that change on every build > with > //an empty bytearray and thus make it compareable > var guidSection = Image.GuidHeap.Section; > var empty = new byte[guidSection.SizeOfRawData]; > Buffer.BlockCopy(empty, 0, byteArray, > TimeDateStampPosition, 4); > Buffer.BlockCopy(empty, 0, byteArray, > FileChecksumPosition, 4); > //MVID > Buffer.BlockCopy(empty, 0, byteArray, > (int) guidSection.PointerToRawData, (int) > guidSection.SizeOfRawData); > > var md5 = new MD5CryptoServiceProvider(); > var result = md5.ComputeHash(byteArray); > > var sb = new StringBuilder(); > for (var i = 0; i < result.Length; i++) > sb.Append(result[i].ToString("X2")); > return sb.ToString(); > } > > The int field TimeDateStampPosition was added to the Image class and > filled in the ReadImage() method of ImageReader (right above the // > TimeDateStamp comment) using the following line: > image.TimeDateStampPosition = (int) BaseStream.Position; > > Also the int field FileChecksumPosition was added to the Image class > and filled in method ReadOptionalHeaders() of class ImageReader. The > line stands under under the Advance(66); statement (which follows > the // FileChecksum comment) and looks like this: > image.FileChecksumPosition = (int) (BaseStream.Position-4); > > For my requirements this works good enough but I would of course be > interested about your thoughts about this, JB. > > Best regards > > Florian > > > On 18 Jun., 23:07, Greg Young <[email protected]> wrote: > > I could use this code as well > > > > On 18 Jun 2011 16:30, "Florian" <[email protected]> wrote: > > Well as it seems, the locations of TimeDateStamp and FileChecksum are > > quite easy to find. Their positions can be found in the DOSHeader and > > in PEOptionalHeader, the first two headers read from a assembly file > > (looked the code up in Mono.Cecil.PE.ImageReader.ReadImage()). > > Unfortunately locating the position of MVID is more complicated. > > > > I am not quite sure what to do. Changing the sourcecode of ImageReader > > on my local machine to save the byte positions of those three fields > > would be the easiest thing to do. This way I could later on build a > > file hash that ignores these fields and reuse the filehash on > > different dlls / exes built on the same sources to get them compared. > > > > But of course every time the next Mono.Cecil version is released I > > would have to do the same changes again and again. > > > > @JB: Would you bother including such a hashing method in the > > Mono.Cecil sources if I can provide you a proper implementation that > > meets your quality expectations? I guess the requirement I have there > > would also be present for other people, for example for working with > > continuous integration build systems. > > > > Best Regards Florian > > > > On 18 Jun., 15:57, Florian <[email protected]> wrote: > > > > > Hi Alex, > > > > > thanks for the pointer, I didnt k... > > > > - Zitierten Text anzeigen -- Zitierten Text ausblenden - > > > > > - Zitierten Text anzeigen - > > > > -- > > -- > > mono-cecil > > -- > -- > mono-cecil > -- -- mono-cecil
