Laden...

Beim Kompilieren mehrere identischer Kopien eines Projekts ist der erstellte ILCode unterschiedlich

Erstellt von MrHiggins vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.244 Views
M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren
Beim Kompilieren mehrere identischer Kopien eines Projekts ist der erstellte ILCode unterschiedlich

Ich kompiliere (sehr) viele einzelne Solutions mittels "ant". Bin dabei aber auf ein Problem gestoßen welches mir zu schaffen macht.

  • Ich habe aus dem SVN in 4 Ordner das selbe ausgecheckt.
  • Ich habe in 3 Ordnern in der selben cs Datei an der selben Stelle überflüssigen Code eingefügt (int i = 5 und bei eine if Abfrage bei der bedingung "& i==5")
  • ich kompiliere alle 3 Ordner mittels ant komplett durch bis release
    Also habe ich 3 gleich veränderte Releases und eine Originale unveränderte.

Nun vergleiche ich mit einem selbstgeschriebenen programm, welches mittels ildasm den il code extrahiert (und von dem ich IDs TimeStamps und Versionsnummern etc. wegparse) die dlls.
Das Ergebnis sollte so sein dass in allen 3 Tests immer die selbe DLL angegeben wird in der sich was verändert hat. Aber:

Bei 1 passt alles. bei den beiden anderen erhalte ich VÖLLIG UNTERSCHIEDLICHE DLLs in UNABHÄNGIGEN SOLUTIONS! über 200 dlls in komplett anderen solutions die mit der veränderten nichts zu tun haben, haben komplett anderen il code. Es ist alles umgestellt! Selbst die DLL größe ändert sich um 10%. Ich frage mich wo er den zusätzlichen Stoff herbekommt, ändere ich doch in einer ganz anderen solution (die in der Buildreihenfolge auch noch viel später auftritt - er weiß also vonder Veränderung noch garnichts) nur 1 Zeile?

Da ich beui allen Tests vom Gleichen Ursprung ausgehe und die Ordner "clean" sind, kann ichmir nur vorstellen dass visual studio beim compilieren irgendwo extern Dinge speichert, die er dann beim compilieren einer gleich benannten DLL oder Solution auskramt und seltsame Dinge anstellt.

Wieso tut er das bei einer Version nicht, sondern nur bei den beiden anderen? Buildvorgang, Reihenfolgen etc war komplett gleich...

Hat da jemand eine Idee für mich?

Gruß Mr. Higgins

F
10.010 Beiträge seit 2004
vor 12 Jahren
  1. Visual Studio compiliert nichts, sondern der cs.exe aus dem SDK

  2. In deine Assemblies werden auch haufenweise Metadaten, wie Versionsnummern, Timestamps usw eingebaut.

  3. Wenn die komplett anderen IL Code haben, ist dein Compiler kaputt.
    Schon mal per diff angeschaut was sich geändert hat?

M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren

Wie gesagt, mit meinem Programm extrahier ich Timestamps etc nachdem ich es mit ildasm disassambled habe und als txt gespeichert habe. Sofern MVID, GUID, Timestamps, versionsnummern etc. anders geworden sind, kapiert das mein programm auch und gibt folgerichtig aus, dass die Dateien gleichen il code haben.

Aber manchmal ist wirklich der KOMPLETTE il code anders. wenn ich zwischen den ildasm files ein diff mache ist JEDE Zeile anders, 10% kommen hinzu und die Befehle finden sich nirgends in der anderen Datei. Die dlls haben sogar bis zu 10% andere Größen. (Nur weil ich in einer völlig unabhängigen DLL im selben Compilevorgang eine Änderung vornehme die lediglich 1 Zeile betrifft und weder Aufrufe hat noch sonst irgendwas.

mir kommt es so vor als ob das fast schon stochastisch ist. Manchmal compiliert er so, das andere mal so.

Interessant ist die tatsache, dass wenn ich alles 5 mal compiliere, im Grunde 2 Versionen der Software rauskommen. 2 mal so, 3mal so. die 2 bzw. 3 gleichen Versionen sind (bis auf die IDs) identisch.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MrHiggins,

mach des doch mal einzeln. Also nicht per Ant alles übersetzen, sondern mit csc.exe einzelne Dateien.

Und wirf deine Annahmen über Bord. Ich vermute, das Problem liegt daran, dass irgendeine deiner Grundannahmen falsch ist.

herbivore

M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren

Ist schwierig da es seeeeehr viele solutions sind die voneinander abhängen.

Eine annahme war dass es mit rebuild funktionieren würde, auch falsch.

Also nochmal zu en Schritten - und Annahmen:

  1. CVS checkout

  2. KOMPLETTES projekt kopieren ergibt v0\ v1\ und v2\

  3. In v1 und v2 exakt die selben Änderungen in Datei X vornehmen die nicht mit anderen zusammenhängt

  4. Alles kompilieren

Dann findet er zwischen v0 und v1 die Dll von X als Unterschied, zwischen v0 und v2 jedoch 200 DLLs.

Da die 200 DLLs nichts mit der von X zu tunhaben, bringt es auch nichts wenn ich nur eine solution kompiliere, da ich ja dann die "Effekte " erst nicht erfasse...

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo MrHiggins,

Dann findet er zwischen v0 und v1 die Dll von X als Unterschied, zwischen v0 und v2 jedoch 200 DLLs.

Dann müsste ja zwischen v0 und v2 auch ein Unterschied von 200 DLLs bestehen.

Und gerade, wenn es mit v1 funktioniert, dann zeigt es doch, dass es funktionieren kann und auch tut, wenn alles passt. Und dass v2 eben doch keine so exakte Kopie von v0 ist, wie v1 es anscheinend ist. Ob der Unterschied bei v2 nun ein Unterschied in den Dateien ist oder an anderen Projekt-, Ant-, Betriebssystem- oder sonstigen Umgebungseinstellungen, sei mal dahingestellt.

Kleine Anekdote:

Während des Studiums hatte eine befreundete Arbeitsgruppe einen Syntaxfehler im Programm. Und egal was sie getan und geändert haben, der Fehler blieb hartnäckig. Erst als die die gesamte Methode oder sogar Klasse entfernt hatten und der Fehler immer noch an genau der gleichen Zeilennummer auftauchte, haben sie gemerkt, dass sie die ganze Zeit eine andere Datei compiliert haben als die, die sie geändert haben.

Mit anderen Worten: manchmal sucht mal einfach verzweifelt, nur eben an der komplett falschen Stelle, weil man - bewusst oder unbewusst - eine falsche Annahme getroffen hat, die man aber nicht als falsch erkennt. In dem Falle, die implizite Annahme, dass man die Änderungen an der Datei vornimmt, die man compiliert. Ich meine nicht, dass es genau diese Annahme bei dir ist. Das war nur ein Beispiel.

herbivore

M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren

wenn ich v1, v2, v3 und v4 nehme, die zu v0 alle die selbe änderung hat, dann gibt es zu v0 entweder 1 (die richtige) änderung oder exakt 200. und die dlls der versionen die 200 unterschiede haben sind auch alle identisch! Also immer die selben Unterschiede zur v0.

Die versionen werden exakt auf die selbe Weise, auf dem selben Rechner nur aus Ordnern die eben v0, v1, v2... heißen compiliert, ich öffne sie dazwischen nicht, ich mache einfach garnichts...

M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren

Ein Aufruf von Rebuild half.

Aber vor allem liegt es an Zeitstempeln beim kopieren der Originalversion, die ihn dazu veranlassen manchmal die Debug, manchmal die releaseversion einer dll zu deployen...

fiese Sache...

U
1.688 Beiträge seit 2007
vor 12 Jahren

Eine annahme war dass es mit rebuild funktionieren würde, auch falsch.

Ein Aufruf von Rebuild half.

?

Aber vor allem liegt es an Zeitstempeln beim kopieren der Originalversion, die ihn dazu veranlassen manchmal die Debug, manchmal die releaseversion einer dll zu deployen...

Das ist ja ohnehin das Undurchsichtige an Deiner Beschreibung: wann nimmst Du woher welche Dateien?

M
MrHiggins Themenstarter:in
29 Beiträge seit 2011
vor 12 Jahren

Ich habe aus einem CVS eine Version gezogen. Das war meine Originalversion Diese habe ich mehrmals kopiert, erstellt und verglichen. Es macht offensichtlich durchaus einen Unterschied ob ich sie lokal 2mal kopiere, oder 3mal einen checkout mache.

Da es mehrere probleme sind die ich inzwischen identifiziert habe half einmal ein rebuild, das andere mal nicht.