11

プロジェクト (asp.net、c#) を aspnet_compiler で再コンパイルすると、コードが変更されていなくても、再構築されたバイナリが (以前のビルドと比較して) 変更されます。

これは、(ビルドを区別するために) ビルドするたびに新しいモジュール バージョン ID (guid) を生成するビルドが原因であると私は理解しています。 .net アセンブリ?

上記のリンクされた質問は、プロジェクトを再構築し、バイナリを同じ変更されていないコードの以前のビルドと一致させる方法がないことを示唆しているようです..わかりました、わかりました-しかし、なぜすべてのバイナリがまったく再構築されているのですか?

ドキュメント(http://msdn.microsoft.com/en-us/library/ms229863(v=vs.80).aspx)によると、-cが引数として指定されていない限り、aspnet_compilerは実際に必要なバイナリを再構築します (コードが変更されたため)。私は誤解していますか、それとも何かが欠けていますか?

私が使用している aspnet_compiler 引数:

aspnet_compiler -f -u -fixednames -nologo -v / -p .\myproject\ .\mybuild\

この問題は、Web アプリケーション プロジェクトではなく、Web サイト プロジェクトでのみ発生することに注意してください (コンパイル方法が異なります)。また、この問題は、機能のない WebSite プロジェクトとページを作成し、ビルド間で開いたり変更したりしない場合でも発生します。

生成されたバイナリを逆コンパイルしても、違いはありません。2 つの「同一」ビルドのバイナリを比較すると、毎回バイナリの同じ部分に小さな違いが見られます。これは、ランダム ビルド GUID に関連していると思われます。ビルド間のこの変更を回避する方法は見つかりませんでした。

4

2 に答える 2

2

C# コンパイラがソース コードをコンパイルするためにマルチパスを作成する方法については、Eric Lippert によるこの優れた回答を確認してください。機能は同じですが、あなたのビルドが以前のものと同一ではない理由はたくさんあります。

  • コンパイラは、block with IL の同等物を使用するなどの特別な言語機能を置き換えます
  • コンパイラはコードに対して多くの最適化を行いますが、反復ごとにわずかに異なる出力が生成される場合があります。
  • コンパイラは匿名メソッド名の具体化された名前を作成する必要があり、コンパイルするたびに異なります
  • そして、逆アセンブラを使用して簡単に理解できる多くの理由

これらの逆アセンブラを確認し、ライブラリまたは実行可能ファイルを逆コンパイルして、理解を深めてください。
http://ilspy.net/http://www.telerik.com/products/decompiler.aspx

于 2013-03-26T14:57:34.797 に答える
0

多くの場合、特に私のプロジェクトが同じソリューション内の他のプロジェクトへの参照を持っている状況で aspnet_compiler を使用すると、説明が難しいことが多い完全な再構築が発生することがわかりました。(私が調査した数回は、空白やコメントなどの変更など、実際には何も影響しない場合でも「変更」がありました)

また、Visual Studio の多くのプラグインで、集計やその他の空白、実際のプロジェクト ファイルなどの操作からすべてを実行するという問題が発生しました。 「変化が見られます!すべてのものを再構築してください!!!

私の答えが助けになるかどうかはわかりませんが、プラグインを無効にし、コンパイラを実行してから、コンパイラを再度実行して、何が起こるかを確認します...

于 2013-02-20T04:00:31.630 に答える