none
MsBuildとVS2008で生成されたDLLのサイズが異なってしまいます。 RRS feed

  • 質問

  • いつもお世話になっております。

    現在VS2008で作成したプロジェクトファイル(*.csproj)を使用してMsBuildでdllを生成しようとしています。
    参照しているdllもビルド対象のcsファイルもVS2008で使用していたものと同一(更新日付・サイズが同じ)のものにもかかわらず、生成されるdllのサイズが違ってしまいます。
    (VS2008の場合:198KB、MsBuildの場合:208KBのサイズでDLLが生成されています。)


    MsBuildでビルドを行った場合、何か付加される情報があったりしてDLLのサイズが大きくなったりするのでしょうか?
    誰かご存知であれば教えてください。
    2009年8月5日 2:45

回答

  • こんにちは、フォーラムオペレーターの高橋春樹です。

    佐祐理さん、Azuleanさん、いつもお世話になっております。

    masayoさん、こんにちは。
    MSDNフォーラムのご利用ありがとうございます。

    英語版のMSDNフォーラムを検索したところ、同じような投稿がありました。

    MSBuild rebuild produces different size assembly compared when re-building solution with Visual Studio
    http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/0b0268be-fe21-4931-82d5-89923767e058

    /property:filealignment=512で解決するとの事ですが、試してもらえないでしょうか?

    FileAlignment プロパティ
    http://msdn.microsoft.com/ja-jp/library/aa983894(VS.71).aspx

    Visual Studioのビルド出力を確認すると、良く分かるのですが、
    /filealignでFileAlignmentを指定しているように見えます。

    小さいプロジェクトだと違いが分からないようなので、こちらで試してないのですが、是非試してください。

    この情報が少しでもお役に立てれば幸いです(^-^)


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    • 回答としてマーク masayo 2009年8月18日 7:42
    2009年8月17日 7:29
  • またソリューションをデスクトップとDドライブ直下でビルドしたDLLのサイズが512バイト違ったのですがビルドを行うディレクトリが変わっただけでそのような差異が出てしまうのでしょうか?
    再度確認のためデスクトップ上に置いたソリューションをDドライブにコピーして生成したのですが結果は同じでした。
    ビルド結果のフォルダに pdb という拡張子のファイルがあると思いますが、そのファイルへのフルパスが exe や dll ファイル内に埋め込まれています。
    このため、ビルドするフォルダのパスの長さが違えば、その分だけ、ファイルに相違が生じます。

    これをなくすためには、.C# のプロジェクトであれば、プロジェクトのプロパティからビルドタブを開き、詳細設定ボタンを押して開くダイアログで、デバッグ情報を none に設定して下さい。
    但し、これを none に設定するとデバッグ機能で利用できなくなる機能等もありますので、Release 構成に対してのみ設定して下さい。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク masayo 2009年8月19日 6:45
    2009年8月18日 13:40
    モデレータ

すべての返信

    • DebugビルドとReleaseビルドがありますが、同じものを選択していますか?
    • MsBuildは2つインストールされていると思いますが、どちらを使用していますか? 別のを使用した場合はどうですか?
    • Visual StudioでMSBuild プロジェクト ビルドの出力の詳細 を設定するとビルド時の出力メッセージを増やすことができます。
      MsBuildも同じく/verbosityオプションで変えることができます。
      両者を見比べてください。
    思いつくのはこの辺りです。
    2009年8月5日 3:57
  • >DebugビルドとReleaseビルドがありますが、同じものを選択していますか?
    ⇒VS、MsBuildとも「RELEASE/AnyCPU」でビルドを行っています。

    MsBuildは2つインストールされていると思いますが、どちらを使用していますか? 別のを使用した場合はどうですか?
    ⇒v3.5とv2.0.50727のどちらでやっても結果は同じでした。

    /verbosity
    ⇒このオプションをつけるとMsbuild側は詳細ログが表示されますが、VS側ではどこを参照すれば詳細ログが出力されているのでしょうか?
    (VSでビルドをかけると「出力」ウィンドゥに簡易的な結果は吐き出されてはいます。)

    また以下のことがわかりました。
    VS2008でビルドしたときに「出力」ウィンドゥに表示されるCSC.exeでのコマンドをコマンドプロンプトより実行すると、生成されるDLLのサイズはMsBuildの生成DLLと同じでVS2008でソリューションビルドを行ったときのサイズとは違っていました。
    ソリューションビルドを行うと内部的に「出力」ウィンドゥに表示されるCSC.exeコマンドが実行されていると思っているのですがなぜ結果が違うのでしょうか。
    ソリューションビルド時は「出力」ウィンドゥに表示されるCSC.exeコマンド以外に何か他の情報を読み込んで処理を行っているのでしょうか?

    そのほかプロジェクト単位でビルドを行った場合もMsbuildで生成されるDLLとサイズは同一のものになりました。
    (1ソリューションの中に複数のプロジェクトが存在しています)
    よってソリューションビルド時だけプロジェクトごとに作成されるDLLのサイズが小さくなっています。
    • 編集済み masayo 2009年8月5日 11:41
    2009年8月5日 6:10
  • マルチポストのようですので、リンクしておきます。
    http://ap.atmarkit.co.jp/bbs/core/fdotnet/15059
    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月7日 16:22
    モデレータ
  • >マルチポストのようですので、リンクしておきます。
    ⇒ネットに投稿するのがはじめてだったので今回はじめて「マルチポスト」という言葉を知りました。
    悪い印象を与えてしまったようでしたら申し訳ございません。

    >解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    ⇒実際まだ調査中ではありますが、リンク先となっているほうのみで継続調査をおこないたいと思いますので、
    ご協力くださった皆様、大変ありがとうございました。
    もし可能であれば解決方法をご存知の方がいらっしゃいましたらリンク先の方でご協力いただければと思います。
    2009年8月11日 0:45
  • こんにちは、フォーラムオペレーターの高橋春樹です。

    佐祐理さん、Azuleanさん、いつもお世話になっております。

    masayoさん、こんにちは。
    MSDNフォーラムのご利用ありがとうございます。

    英語版のMSDNフォーラムを検索したところ、同じような投稿がありました。

    MSBuild rebuild produces different size assembly compared when re-building solution with Visual Studio
    http://social.msdn.microsoft.com/Forums/en-US/msbuild/thread/0b0268be-fe21-4931-82d5-89923767e058

    /property:filealignment=512で解決するとの事ですが、試してもらえないでしょうか?

    FileAlignment プロパティ
    http://msdn.microsoft.com/ja-jp/library/aa983894(VS.71).aspx

    Visual Studioのビルド出力を確認すると、良く分かるのですが、
    /filealignでFileAlignmentを指定しているように見えます。

    小さいプロジェクトだと違いが分からないようなので、こちらで試してないのですが、是非試してください。

    この情報が少しでもお役に立てれば幸いです(^-^)


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    • 回答としてマーク masayo 2009年8月18日 7:42
    2009年8月17日 7:29
  • 高橋様ありがとうございました。

    同一サイズのDLLが生成されました!!

    ただ逆アセンブラ(ILDASM)でテキストに落としたものをDIFFツールで中身を確認すると記述箇所が違うため差異が表示されます。
    これはDLLの記述内容が違うのか逆アセンブラツールの仕様のためなのでしょうか?
    動作は同一になるのでしょうか?

    またソリューションをデスクトップとDドライブ直下でビルドしたDLLのサイズが512バイト違ったのですがビルドを行うディレクトリが変わっただけでそのような差異が出てしまうのでしょうか?
    再度確認のためデスクトップ上に置いたソリューションをDドライブにコピーして生成したのですが結果は同じでした。

    • 編集済み masayo 2009年8月18日 7:58
    2009年8月18日 7:57
  • またソリューションをデスクトップとDドライブ直下でビルドしたDLLのサイズが512バイト違ったのですがビルドを行うディレクトリが変わっただけでそのような差異が出てしまうのでしょうか?
    再度確認のためデスクトップ上に置いたソリューションをDドライブにコピーして生成したのですが結果は同じでした。
    ビルド結果のフォルダに pdb という拡張子のファイルがあると思いますが、そのファイルへのフルパスが exe や dll ファイル内に埋め込まれています。
    このため、ビルドするフォルダのパスの長さが違えば、その分だけ、ファイルに相違が生じます。

    これをなくすためには、.C# のプロジェクトであれば、プロジェクトのプロパティからビルドタブを開き、詳細設定ボタンを押して開くダイアログで、デバッグ情報を none に設定して下さい。
    但し、これを none に設定するとデバッグ機能で利用できなくなる機能等もありますので、Release 構成に対してのみ設定して下さい。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク masayo 2009年8月19日 6:45
    2009年8月18日 13:40
    モデレータ
  • Azuleanさん、回答ありがとうございます。
    各プロジェクトで「none」に設定したらビルドするディレクトリが違っても同一サイズのDLLになりました。

    またMsBuildでは以下のコマンドで同一サイズのDLLが生成されました。
    「MsBuild XXXX.sln toolsversion:3.5 /p:Configuration=RELEASE;Filealignment=512;DebugType=none /t:Rebuild」

    これはPBDONLY、FULLの指定だと作成されるアセンブリにpdbファイルのフルパスが埋め込まれるため
    ビルドするディレクトリによってDLLのサイズに差が出ていたとの認識で合っていますでしょうか?

    こちらの環境ではもともとPDBファイルは使用していないため「none」を設定することで問題なさそうです。
    ありがとうございました。

     

    2009年8月19日 7:21
  • これはPBDONLY、FULLの指定だと作成されるアセンブリにpdbファイルのフルパスが埋め込まれるため
    ビルドするディレクトリによってDLLのサイズに差が出ていたとの認識で合っていますでしょうか?
    そうではないかと思って、提案しました
    実際にどうだったかは、私には確認できませんので、バイナリエディタで比較してみる等してみてください。

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月19日 13:33
    モデレータ