none
xmlコメントについて RRS feed

  • 質問

  • 初めて投稿致します。 _kimura と申します。

    仕事でC#を使用したソフトウェア開発を行っているのですが、
    xmlファイル(xmlコメントファイル)が旨く生成されずに困っています。

    現象としては、独自のクラスを作成してクラスライブラリとして、ビルドし、
    dllとxmlコメントファイルを生成しています。

    dllについては、修正現時点の状態で生成されるのですが、
    xmlコメントファイルについては、修正前の状態で生成されるため、
    dllとxmlコメントの整合性が、取れない状態になっています。

    どなたか、対応方法が分かりましたらお教え頂けますでしょうか。

    2010年2月3日 10:47

回答

  • メニューの [表示]、[出力] で確認できる、ビルド時のログに何か手掛かりはないでしょうか?

    すべてあてずっぽうですが、
    ソリューションにその XML ドキュメントファイルを追加されていて、そのプロパティの「出力ディレクトリにコピー」を "常にコピーする" にされていたりはしないですよね?
    アプリケーションのプロパティにある「ビルドイベント」で、どこかからコピーされていないですよね?
    Visual Source Safe 等のソース管理も関係ないですよね?(どんなふうに影響するかは想像できていませんが。)
    ソリューションファイルやプロジェクトファイル(.sln や.csproj)を直接テキストエディタで開いてみても、おかしなところはないですよね?
    .suo ファイル(隠しファイル設定)を削除しても同じでしょうか?(削除前にバックアップしてください。これは一番可能性が低いので、されなくてもいいです。)

    • 回答としてマーク _kimura 2010年2月8日 3:48
    2010年2月5日 6:53
  • プロジェクトのプロパティで指定されている「XML ドキュメント ファイル」のチェックを切って、ビルドした結果
    対象となるxmlファイルが「2010/01/21」の日付で生成されていました。
    また、XML ドキュメント ファイルの名称「a.xml」に変更して(現在はプロジェクト名.xml)ビルドした結果、
    a.xmlはビルド時の日付で作成され、プロジェクト名.xmlは「2010/01/21」で作成されました。
    TH01 さんも指摘されていますが、この挙動から、XML ファイルが何らかの形で上書きされていることが推測されます。

    もっとも怪しいのは、ビルドイベントですね。
    これでどこかからコピーするようなコマンドが設定されていると、XML ドキュメントファイルを生成しても上書きされてしまいます。


    # 出力先を消した上でビルドするだけでできるのであれば、ソース管理は多分無罪。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク _kimura 2010年2月8日 3:47
    2010年2月5日 16:27
    モデレータ

すべての返信

  • 回答ではなくて確認になります。

    その整合性がとれない XML ファイルは、必ずビルド1回分、前の状態になるのでしょうか?(1回ずつ分ずれてる)
    それとも、何回も前の状態になるのでしょうか?(リビルドしても変わらない)

    前者であれば何かよく分からない問題がある?、後者であれば単純に上書きできていない or されていないことが考えられます。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月3日 13:56
    モデレータ
  • 説明不足で申し訳ありません。

    現時点で該当するクラスをクラスライブラリとしてビルドすると、
    dllについては現時点のソースコード元に生成されるのですが、
    xmlファイルについては、過去(私の環境では2010/1/21)の
    ファイルが生成されて、最新のxmlファイルが生成されません。

    上記に示した日付位までは、正常にxmlファイルは生成されていたのですが、
    この日付を境に、現状のソースコードでxmlファイルが生成されないようになりました。

    また、ビルドの出力先のフォルダを削除してから、
    再度リビルドした場合でも、xmlファイルのみ過去のファイルが生成されます。

    以上です。何かご存知でしたらお教え頂けますでしょうか。
    2010年2月4日 6:50
  • また、ビルドの出力先のフォルダを削除してから、
    再度リビルドした場合でも、xmlファイルのみ過去のファイルが生成されます。
    どこかの過去のファイルが残っているのかな…。

    プロジェクトのプロパティの「XML ドキュメント ファイル」で指定されているパスは、間違っていないのですよね?
    また、出力先フォルダを消して、このチェックを切って、ビルドするとファイルはコピーされないのですよね?
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク _kimura 2010年2月8日 3:47
    • 回答としてマークされていない _kimura 2010年2月8日 3:47
    2010年2月4日 14:00
    モデレータ
  • 確か xml ドキュメントファイルは Debug モードでしか生成できないという話を聞いた覚えがありますが・・・
    Release ビルドになってたりしませんよね?

    #あくまでうろ覚えです。明日になったら試せるかも知れませんが・・・今日はもう寝ます。(^ω^;
    2010年2月4日 16:08
    モデレータ
  • 確か xml ドキュメントファイルは Debug モードでしか生成できないという話を聞いた覚えがありますが・・・
    そういうことはありません。
    ただ、各構成毎に XML ドキュメント ファイルを生成する設定が必要です。
    (Debug 構成だけしか設定していなければ、Release 構成では生成されないのは当然ですが、よくハマる話です)

    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月4日 17:00
    モデレータ
  • プロジェクトのプロパティの「XML ドキュメント ファイル」で指定されているパスは、間違っていないのですよね?
    また、出力先フォルダを消して、このチェックを切って、ビルドするとファイルはコピーされないのですよね?

    プロジェクトのプロパティで指定されている「XML ドキュメント ファイル」のチェックを切って、ビルドした結果
    対象となるxmlファイルが「2010/01/21」の日付で生成されていました。
    また、XML ドキュメント ファイルの名称「a.xml」に変更して(現在はプロジェクト名.xml)ビルドした結果、
    a.xmlはビルド時の日付で作成され、プロジェクト名.xmlは「2010/01/21」で作成されました。

    Azuleanさんの回答に有るように、どこかに過去のxmlファイルが残っていて出力されている為、
    プロジェクト名.xml が旨く作成されていないように思います。

    現時点では、「a.xml」でコメントファイル作成し、その後でファイル名を「プロジェクト名.xml」に変更する方法が
    有力に思われるのですが、他に良い対応策をご存知でしたらお教え頂けますでしょうか?
    2010年2月5日 0:10
  • > そういうことはありません。
    > ただ、各構成毎に XML ドキュメント ファイルを生成する設定が必要です。
    > (Debug 構成だけしか設定していなければ、Release 構成では生成されないのは当然ですが、よくハマる話です)

    仰るとおり見事に外してました。orz
    でも、確かにこれはハマりやすいポイントですね。

    しかし謎な話です。。。(-ω-
    2010年2月5日 5:34
    モデレータ
  • メニューの [表示]、[出力] で確認できる、ビルド時のログに何か手掛かりはないでしょうか?

    すべてあてずっぽうですが、
    ソリューションにその XML ドキュメントファイルを追加されていて、そのプロパティの「出力ディレクトリにコピー」を "常にコピーする" にされていたりはしないですよね?
    アプリケーションのプロパティにある「ビルドイベント」で、どこかからコピーされていないですよね?
    Visual Source Safe 等のソース管理も関係ないですよね?(どんなふうに影響するかは想像できていませんが。)
    ソリューションファイルやプロジェクトファイル(.sln や.csproj)を直接テキストエディタで開いてみても、おかしなところはないですよね?
    .suo ファイル(隠しファイル設定)を削除しても同じでしょうか?(削除前にバックアップしてください。これは一番可能性が低いので、されなくてもいいです。)

    • 回答としてマーク _kimura 2010年2月8日 3:48
    2010年2月5日 6:53
  • プロジェクトのプロパティで指定されている「XML ドキュメント ファイル」のチェックを切って、ビルドした結果
    対象となるxmlファイルが「2010/01/21」の日付で生成されていました。
    また、XML ドキュメント ファイルの名称「a.xml」に変更して(現在はプロジェクト名.xml)ビルドした結果、
    a.xmlはビルド時の日付で作成され、プロジェクト名.xmlは「2010/01/21」で作成されました。
    TH01 さんも指摘されていますが、この挙動から、XML ファイルが何らかの形で上書きされていることが推測されます。

    もっとも怪しいのは、ビルドイベントですね。
    これでどこかからコピーするようなコマンドが設定されていると、XML ドキュメントファイルを生成しても上書きされてしまいます。


    # 出力先を消した上でビルドするだけでできるのであれば、ソース管理は多分無罪。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク _kimura 2010年2月8日 3:47
    2010年2月5日 16:27
    モデレータ
  • 回答を頂き有難う御座いました。
    皆さんの回答を基に、再度検証した結果、xmlファイルが過去のファイルとして
    出力された原因が、判明しました。

    xmlファイルが過去のファイルが出力されていた、原因と致しましては、
    dllが循環参照されていたことにありました。

    まず、基本となる「クラスライブラリA」(A.dll) を作成します。
    次に、「A.dll」を参照して「クラスライブラリB」(B.dll)を作成します。
    最後に、「クラスライブラリA」に「B.dll」の参照を追加します。

    ビルド時のログを確認するとクラスライブラリAをビルドした際に、

    1.クラスライブラリAのxmlコメントを作成
    2.クラスライブラリAのdllを出力

    の順に処理されているらしく、
    1、2の間で、クラスライブラリBで参照しているdllとxmlコメントファイルを
    出力ディレクトリにコピーをしているようです。

    その為、クラスライブラリAのxmlが上書きされてしまい、
    xmlファイルが過去のファイルが出力されていたようです。

    私としましては、dllの構成を再度検証する時間も有りませんので、
    プロジェクト名.xmlと異なる名称のxmlコメントファイルを作成して、
    ファイル名を変更して対応したいと思います。

    2010年2月8日 3:46
  • _kimura さん自身にも回答マークを付けられてはいかがですか?
    (ひらぽんさんの返信も)
    他の人のためになる話だと思いました。

    時間がないので仕方がないですが、やはり理想としては循環参照にすべきではないと思います。
    どちらかは古い DLL に依存してビルドが行われますし、A か B のどちらが上書きされるかについても、メニューの [プロジェクト]、[プロジェクトの依存関係] の画面の [ビルドの順序] 次第かと思いますが、循環参照の場合はどちらにもなりえると思います。

    それと、現状はプロジェクトの参照ではなく直接 DLL を参照されていると思いますが、その DLL の参照のプロパティにある「ローカルコピー」はデフォルトの True ではなく、False にされた方が良さそうに思います。
    True の場合、今試してみると XML だけでなく DLL 自体も片方は古いままになりましたし、False の場合には XML ドキュメントはそれぞれの出力パスにのみ、作成されました。
    循環参照があると、True の場合のローカルコピーを更新してくれる部分が期待されてるようには機能しないのだろうと思いますが、これは仕方がないように思います。(ローカルコピーの更新に関係ない A の xml が上書きされるのは不可解ですけど)

    2010年2月8日 12:35
  • アセンブリ間の相互参照は避けるべきです。(「してはならない」と言い切るには説明不足だと思いましたので、弱い表現を選んでいます)
    実際、同じソリューションに加えて、プロジェクト参照をしようとすると、下記のようなエラーメッセージが表示されます。


    'ClassLibrary1' への参照を追加できませんでした。 このプロジェクトを参照として追加すると循環する依存関係を生じます。


    アセンブリ間の相互参照は基本的に想定されていないものだとお考えください。
    大抵の場合、両方のアセンブリで共通で使うクラスなどの型をもう1つ別のアセンブリとして抽出し、そのアセンブリを参照するようにすれば解決できるはずです。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年2月8日 13:46
    モデレータ