none
AssemblyInfo.cppですが RRS feed

  • 質問

  • VS2008PROを使用しています。
    同類の質問が過去にあったみたいなんですが、結局結論がわからないので質問させてもらいます。
    C++/CLIでウィザードで自動生成されるAssemblyInfo.cppですが、このソースに記述された内容
    はEXEファイルのバージョン情報に反映されないようですけど、ではこのAssemblyInfo.cppはどう
    いう使い方をするべき物なのでしょうか?
    2009年7月9日 10:58

回答

  • アセンブリに適用できるバージョン用の属性は 3 つあります。AssemblyVersion 属性、AssemblyFileVersion 属性、AssemblyInformationalVersion 属性です。
    このうち、AssemblyFileVersion と AssemblyInformationalVersion は該当アセンブリのカスタム属性として格納されています。
    AssemblyInformationalVersion に関しては、実行ファイルのプロパティ→詳細→製品バージョンが空だった場合に System::Windows::Forms::Application::ProductVersion で取得できるバージョンに影響します。
    AssemblyFileVersion の方は特に表に出てくることは無いように見えます。

    AssemblyVersion は、アセンブリのバージョン管理に使われる重要な情報であり、カスタム属性ではなくアセンブリ名の一部として使用されています。
    System::Console::WriteLine(Syste::Object::typeid->AssemblyQualifiedName);
    などとやると型の完全修飾型名が表示されますが、後半のアセンブリ名にバージョン情報も格納されているのがわかります。
    ただ、ファイルのプロパティとして Explorer から確認ってことはできないようです。
    // Windows XP だとアセンブリバージョンとかプロパティに表示されてたような気がするんだけど……記憶違いだったかな。

    C++/CLI の場合 .rc ファイルでファイルバージョンと製品バージョンを指定するため、これらの属性は使われないみたいですね。C# だと AssemblyFileVersion や AssemblyInformationalVersion を設定すれば実行ファイルのプロパティのファイルバージョンや製品バージョンも変更されるんですけど。
    ファイルバージョンや製品バージョンを設定するのに必要である(まあ AssemblyVersion で代用できるんですが)C# と異なり、C++/CLI の場合 AssemblyFileVersion 及び AssemblyInformationalVersion は影が薄い存在になるでしょう。
    反面、AssemblyVersion はファイルのプロパティにこそ出てきませんが、厳密名を付けて運用されるアセンブリでは重要な意味を持ちます。実行ファイルの作成者が想定していないバージョンの dll のロードを行わないようにする、といったことが可能です。

    バージョン以外の属性も、Assembly... という名前の属性は基本的に .rc の方で定義するもののため AssemblyFileVersion と同程度の意味しかないでしょう。
    ComVisible 属性や CLSCompliant 属性は独自の意味があるものなので、これらは必要に応じて定義します。まああまり普段気にするものではないでしょうけど。
    • 回答としてマーク paosan 2009年7月10日 9:18
    2009年7月10日 6:10

すべての返信

  • アセンブリに適用できるバージョン用の属性は 3 つあります。AssemblyVersion 属性、AssemblyFileVersion 属性、AssemblyInformationalVersion 属性です。
    このうち、AssemblyFileVersion と AssemblyInformationalVersion は該当アセンブリのカスタム属性として格納されています。
    AssemblyInformationalVersion に関しては、実行ファイルのプロパティ→詳細→製品バージョンが空だった場合に System::Windows::Forms::Application::ProductVersion で取得できるバージョンに影響します。
    AssemblyFileVersion の方は特に表に出てくることは無いように見えます。

    AssemblyVersion は、アセンブリのバージョン管理に使われる重要な情報であり、カスタム属性ではなくアセンブリ名の一部として使用されています。
    System::Console::WriteLine(Syste::Object::typeid->AssemblyQualifiedName);
    などとやると型の完全修飾型名が表示されますが、後半のアセンブリ名にバージョン情報も格納されているのがわかります。
    ただ、ファイルのプロパティとして Explorer から確認ってことはできないようです。
    // Windows XP だとアセンブリバージョンとかプロパティに表示されてたような気がするんだけど……記憶違いだったかな。

    C++/CLI の場合 .rc ファイルでファイルバージョンと製品バージョンを指定するため、これらの属性は使われないみたいですね。C# だと AssemblyFileVersion や AssemblyInformationalVersion を設定すれば実行ファイルのプロパティのファイルバージョンや製品バージョンも変更されるんですけど。
    ファイルバージョンや製品バージョンを設定するのに必要である(まあ AssemblyVersion で代用できるんですが)C# と異なり、C++/CLI の場合 AssemblyFileVersion 及び AssemblyInformationalVersion は影が薄い存在になるでしょう。
    反面、AssemblyVersion はファイルのプロパティにこそ出てきませんが、厳密名を付けて運用されるアセンブリでは重要な意味を持ちます。実行ファイルの作成者が想定していないバージョンの dll のロードを行わないようにする、といったことが可能です。

    バージョン以外の属性も、Assembly... という名前の属性は基本的に .rc の方で定義するもののため AssemblyFileVersion と同程度の意味しかないでしょう。
    ComVisible 属性や CLSCompliant 属性は独自の意味があるものなので、これらは必要に応じて定義します。まああまり普段気にするものではないでしょうけど。
    • 回答としてマーク paosan 2009年7月10日 9:18
    2009年7月10日 6:10
  • 難しくてわかりにくいですけど、エクスプローラから参照できるネイティブ情報じゃないのでC#みたいに
    直接EXEに情報を格納させてる訳じゃないんですね。
    このファイルがわざわざ生成されている意味があまりないような気がしますね。
    2009年7月10日 9:19
  • ちょっと逆です。歴史的にもC++→C#の順です。

    C++では.rcファイルでファイルのバージョン情報を設定します。C++/CLIになってもこの部分は変わっていません。
    C#でも/win32resオプションを指定することでC++と同じように設定することができます。ただし、/win32resを省略した場合、C#コンパイラはAssembly*属性を元にバージョン情報を自動生成してくれます。

    Assembly*属性については、たぶんHongliangさんの説明の通り、かな。
    2009年7月10日 11:16