6

私は、異なる時点で 2 つの別々のマシンでコンパイルされた同一の C# コードによって生成されたリリース バージョンのバイナリをプログラムで調べて、コードが同一であると結論付けるのに十分スマートなツールを生成しようとしています。これらのバイナリを生成するために使用される c# コード。

私は多くのアプローチを使用してみましたが、これを短く保つために、最新の試みに固執します. バイナリで /text オプションを指定して ildasm を実行し、匿名フィールドなどの GUID をテキストに置き換えますが、バイナリが別の PC からのものである場合、ILDASM の /text オプションによって生成されたテキストが並べ替えられていることがわかります。同じコードに由来するが、異なるマシンで同じセットアップによってコンパイルされたバイナリも、大幅に並べ替えられているように見えます。この IL の並べ替えをどのように制御できるかについての提案をいただければ幸いです。

乾杯

PS: これを確実に達成するための代替戦略も大歓迎です。

4

2 に答える 2

7

Eric Lippert が目を覚ますのを待っています :) - @mikez のコメントからのコミュニティ wiki:

コンパイラ チームの主要な開発者 (Eric Lippert) が話すときは、耳を傾けるべきですそれをしないための説明と強力な推奨事項(おそらくこの正確な質問への回答):

同じ C# プログラムを 2 回コンパイルすると、同じバイナリ出力が生成されることが保証されていますか?

いいえ。

于 2012-07-05T07:23:23.963 に答える
2

Eric Lippert が彼の投稿で述べたように、コンパイル プロセスのプロセッサ アフィニティを 01 に設定することで解決できることがわかりました。 som mvid と guids が使用されます。テキスト モードでこれらのバイナリに対して ILDASM を実行し、単純なハッシュ ツールを構築して、このランダムなものを取り除くことで、このようなソリューションが提供されます。私はこれを完成させ、この問題に直面する可能性のある他の人を助けるために提供しています.

于 2012-07-08T23:11:54.933 に答える