次の方法で共有


アプリケーションのバージョンの管理

 

Mike Gunderloy
ラークグループ株式会社

2002 年 2 月

概要: Visual Basic 6.0 のバージョン情報とアプリケーション オブジェクトを使用せずに、Microsoft Visual Basic .NET アプリケーションのバージョン番号を設定および取得する新しい方法について説明します。 (9 ページ印刷)

目標

  • Microsoft® Visual Basic .NET アプリケーションでバージョン情報を設定および取得する
  • 共通言語ランタイムがコンポーネントのバージョンを処理する方法を理解する

前提条件

このドキュメントを最大限に活用するには、次のことが当てはまります。

  • Visual Basic プログラミングに精通している
  • Visual Basic .NET にアクセスできます
  • コンポーネント ベースのアプリケーションに精通している

内容

Visual Basic .NET のバージョン番号
バージョンの互換性
実行時のバージョン情報の変更の練習
Visual Basic 6.0 以降の新機能
まとめ

Visual Basic .NET のバージョン番号

Visual Basic .NET に移行する Visual Basic 6.0 開発者を驚かせることの 1 つは、[ プロジェクト ] メニューの [プロパティ ] 項目にバージョン情報がないことです。 また、Visual Basic .NET にはアプリケーション オブジェクトがありません。 これら 2 つの項目がない場合は、Visual Basic .NET アプリケーションのバージョン番号を設定および取得する新しい方法を学習する必要があります。

バージョン番号の設定

Visual Basic .NET の主な機能の 1 つは、非表示の情報が存在しない点です。 Visual Basic .NET を使用して新しいアプリケーションを作成すると、AssemblyInfo.vb という名前のモジュールがプロジェクトに自動的に追加されます。 このモジュールには、プロジェクト プロパティに相当する Microsoft .NET のアセンブリ属性の設定が含まれています。 これらの中には、タイトル、説明、会社名などの項目が、このプロジェクトから作成された最終的な実行可能ファイルまたは.dllファイルで使用されます。 AssemblyInfo.vb モジュールには、バージョン番号を設定する行も含まれています。 既定では、次のようになります。

<Assembly: AssemblyVersion("1.0.*")>

Microsoft .NET のバージョン番号には、次の 4 つの部分があります。

  • 主要な部分
  • マイナー パーツ
  • ビルド パーツ
  • リビジョン パーツ

Assembly Version 属性を "1.0.*" に設定すると、Visual Basic .NET では、メジャー パーツに 1、マイナー パーツに 0 を使用し、ビルドとリビジョンのパーツ番号を自動的に作成するように指示されます。 この場合、Microsoft .NET は任意のビルド パーツと任意のリビジョン パーツを割り当て、アセンブリを再構築するたびにリビジョン パーツを変更します。 バージョン番号の 4 つの部分すべてを明示的に指定することもできます。

<Assembly: AssemblyVersion("1.0.4.3")>

バージョン番号は、4 つの 32 ビット番号に論理的にパーティション分割された 128 ビット番号として格納されます。 つまり、4 つの部分のそれぞれは、0 ~ 65,536 の範囲の任意の数にすることができます。

バージョン番号の取得

Visual Basic .NET からアプリケーションのバージョン番号を取得するには、System.Reflection 名前空間から AssemblyName クラスを使用できます。 このクラスには、Version クラスのインスタンスを返す Version プロパティがあります。 Version クラスは、バージョン番号情報の取得に使用できる一連のプロパティを実装します。

  • Major は、メジャー 部分を含む整数を返します。
  • Minor は、マイナー 部分を含む整数を返します。
  • Build は、ビルド パーツを含む整数を返します。
  • Revision は、リビジョン パーツを含む整数を返します。

これらのプロパティを使用すると、ファイルにアセンブリ マニフェストが含まれている場合に、その場所がわかっている任意のファイルからバージョン情報を返すことができます。 AssemblyName クラスの GetAssemblyName メソッドを使用して、ディスク ファイルから AssemblyName オブジェクトを取得できます。

Dim anm As System.Reflection.AssemblyName = _
 System.Reflection.AssemblyName.GetAssemblyName( _
 "c:\winnt\microsoft.net\framework\v1.0.3617\mscorlib.dll")
MessageBox.Show(anm.Version.Major)

System.Reflection 名前空間の Assembly クラスの GetExecutingAssembly メソッドによって返される Assembly の GetName メソッドを使用して、現在の実行可能ファイルのバージョン情報を取得することもできます。

MessageBox.Show(System.Reflection. _
 Assembly.GetExecutingAssembly. _
 GetName.Version.Major) 

バージョンの互換性

バージョン情報の設定と取得は Visual Basic .NET で変更されましたが、この領域での大きな変更ではありません。 バージョン情報のメイン使用は、コンポーネントの特定のバージョンがコンポーネントを使用するアプリケーションと互換性があるかどうかをアプリケーションと開発者が判断するのに役立ちます。 既定では、Microsoft .NET では、アセンブリのコンパイル時に存在していたコンポーネントのバージョンのみが使用されます。

たとえば、Visual Basic 6.0 アプリケーションが xyz.dll という名前のコンポーネントを呼び出し、アプリケーションのコンパイル時にバージョン 1 がコンピューター上に存在し、xyz.dll のバージョン 1.1 以降がインストールされている場合、アプリケーションはバージョン 1.1 を自動的に呼び出します (再コンパイル時に新しいバージョンが古いバージョンと互換性があるとマークされていたと仮定します)。 これに対し、Microsoft .NET で同じ状況が発生した場合、アプリケーションは、新しいバージョンの使用を明示的に指定しない限り、xyz.dllのバージョン 1 を引き続き呼び出します。

コンパイル時に存在していたコンポーネントのバージョンにアセンブリを結合することで、.NET Frameworkは、新しいバージョンの共有ライブラリが既存のアプリケーションを中断する "DLL Hell" 症候群を回避するのに役立ちます。

互換性レベル

新しいバージョンをリリースするときに、任意のバージョン番号を自由に使用できます。 ただし、新しいバージョン番号を選択するための標準を確立すると便利です。 Microsoft が提案する標準の 1 つを次に示します。

  • 新しいメジャー パーツまたはマイナー パーツは、新しいバージョンが古いバージョンと互換性を持たれなきことを示します。 たとえば、バージョン 2.0.0.0 はバージョン 1.1.2.5 と互換性がありません。 コードに互換性がない場合は、常にメジャー バージョン番号を変更する必要があります。
  • 新しいビルド パーツは、互換性の可能性を示します。 通常、サービス パックまたはマイナー アップグレードを導入する場合は、マイナー バージョン番号を変更する必要があります。 たとえば、バージョン 1.8.0.0 は、おそらくバージョン 1.7.0.0 と互換性があります。
  • 新しいリビジョン パーツは、以前のバージョンと互換性があり、インストールする必要がある QFE (Quick Fix Engineering) リリースを示します。 たとえば、バージョン 1.6.5.13 は、バージョン 1.6.5.12 への必須のバグ修正アップグレードである可能性があります。

実行時に正しいバージョンを見つける

外部コンポーネントを使用する Microsoft .NET アプリケーションを実行すると、Microsoft .NET ランタイムによって 4 つの場所がチェックされ、読み込むコンポーネントのバージョンが決定されます。

  1. アセンブリ マニフェストの元のバージョンは、読み込む既定のバージョンです。
  2. その後、ランタイムは、このアプリケーションのバージョン情報のみをオーバーライドするアプリケーション ポリシー ファイルが存在することを確認します。
  3. その後、ランタイムは、すべてのアプリケーションでこのコンポーネントのバージョン情報をオーバーライドする発行元ポリシー ファイルが存在することを確認します。
  4. その後、ランタイムは、システム全体でこのコンポーネントのバージョン情報をオーバーライドする管理者ポリシー ファイルが存在するかどうかを確認します。

**警告 **バージョン チェックは、厳密な名前を持つファイルに対してのみ実行されます。 ファイルの厳密な名前を生成するには、sn.exe ユーティリティを使用してキー ペアを生成し、そのキー ペアをコンポーネントにコンパイルする必要があります。 この手法の例については、このドキュメントの後半で説明します。

ポリシー ファイル

ポリシー ファイルは、使用するコンポーネントのバージョンを指定できる XML ファイルです。 ポリシー ファイルの一般的な構造は、次のテンプレートに従います。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="ComponentName"
               publicKeyToken="PublicKey" />
            <bindingRedirect oldVersion="version"
                             newVersion="version"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

oldVersion 属性のバージョンは、"1.0.0.0" などの 1 つのバージョン番号、または "1.0.0.0-3.0.0.0" などのバージョン番号の範囲のいずれかになります。 newVersion 属性のバージョンは、アセンブリ マニフェストで指定されたバージョンではなく、読み込む必要があるコンポーネントのバージョン番号です。

ヒント ポリシー ファイルを手動で編集する必要はありません。 .NET Frameworkには、Microsoft 管理コンソールが、これと他の Microsoft .NET 構成タスクを処理するためのスナップインが含まれています。

ランタイムがバージョン情報をチェックするポリシー ファイルは 3 つあります。

  • アプリケーション ポリシー ファイルは、アプリケーションと同じ名前と拡張子 ".config" を持ち、アプリケーションと同じディレクトリに存在します。 たとえば、MyApp.exeのアプリケーション構成ファイルには、MyApp.exe.configという名前が付けられます。場合によっては、アプリケーション ポリシー ファイルの名前が Microsoft .NET によって指示されます。 たとえば、ASP.NET アプリケーションのアプリケーション ポリシー ファイルには、常に Web.config という名前が付けられます。
  • パブリッシャー ポリシー ファイルは、コンポーネントパブリッシャーによって、新しいバージョンのコンポーネントと共に配布されます。 アセンブリ自体がである必要がない場合でも、発行者ポリシー ファイルをグローバル アセンブリ キャッシュ (GAC) にインストールする必要があります。
  • マシン構成ファイルは Machine.config という名前で、Microsoft .NET ランタイムがインストールされているディレクトリの下にある Config ディレクトリに格納されます。

実行時のバージョン情報の変更の練習

次の例では、クラス ライブラリの 2 つのバージョンと、ライブラリの 1 つのバージョンからメソッドを呼び出すクライアント アプリケーションを作成します。 ライブラリのより新しいバージョンがインストールされている場合でも、アプリケーション構成ファイルを明示的に構築するまで、古いバージョンがクライアント アプリケーションによって使用されることがわかります。

クラス ライブラリを作成する

ユーザー インターフェイスに文字列を返すクラス ライブラリを作成するには、次の手順に従います。

  1. Visual Studio .NET を開き、[ スタート] をクリックし、[ 新しいプロジェクト] をクリックします。

  2. 左側のウィンドウで、ツリー ビューから [ Visual Basic プロジェクト] を選択します。

  3. プロジェクト テンプレートとして [ クラス ライブラリ ] を選択します。

  4. アプリケーションの名前を MiscInfo に設定します。 プロジェクトの C:\MiscInfo の場所を指定します。 [OK] をクリックして、プロジェクトを作成します。

  5. ソリューション エクスプローラー ウィンドウで、Class1.vb というクラスを選択し、名前を Info.vb に変更します。

  6. Info.vb の Class1 のコードを選択し (これは空のクラス定義になります)、次のコードに置き換えます。

    Public Class Info
    
        Public ReadOnly Property Version() As String
            Get
                Version = Me.GetType.Assembly.GetName. _
                 Version.ToString
            End Get
        End Property
    
    End Class
    
  7. AssemblyInfo.vb のコードを開き、AssemblyVersion 行を次のコードに置き換えます。

     <Assembly: AssemblyVersion("1.0.0.0")>
    
  8. [ スタート ] メニューの [プログラム] をクリックし、[ Microsoft Visual Studio .NET 7.0]、[ Visual Studio .NET Tools] の順にクリックし、[ Visual Studio .NET コマンド プロンプト] をクリックします。 次のように入力します。

    sn -k MiscInfo.snk
    

    これにより、Miscinfo.snk ファイルにキー ペアが作成されます。 このファイルを MiscInfo プロジェクトを含むフォルダーにコピーします。

  9. AssemblyInfo.vb ファイルの末尾に次のコードを追加します。

    <Assembly: AssemblyKeyFile("C:\MiscInfo\MiscInfo.snk")>
    
  10. プロジェクトのバージョン 1.0.0.0 を作成するには、[ ビルド ] メニューの [ ソリューションのビルド] をクリックします。

  11. AssemblyInfo.vb のコードを開き、AssemblyVersion 行を次のコードに置き換えます。

     <Assembly: AssemblyVersion("2.0.0.0")>
    
  12. 図 1 に示すように、ソリューション エクスプローラーで MiscInfo プロジェクトを選択します。

    図 1. MiscInfo プロジェクトの選択

  13. [ プロジェクト ] メニューの [ プロパティ] をクリックし、[ 構成プロパティ] の [ ビルド] をクリックします。 [出力パス] プロパティを bin2\ に変更します。 [OK] をクリックします。

  14. プロジェクトのバージョン 2.0.0.0 を作成するには、[ ビルド ] メニューの [ ソリューションのビルド] をクリックします。

  15. コマンド プロンプト ウィンドウで、プロジェクトのバージョン 1 を含む C:\MiscInfo\bin フォルダーに移動し、次のように入力します。

    
    gacutil /i MiscInfo.dll
    

    このバージョンをグローバル アセンブリ キャッシュに追加する場合は 。

  16. コマンド プロンプト ウィンドウで、プロジェクトのバージョン 2 を含む C:\MiscInfo\bin2 フォルダーに移動し、「」と入力します。

    gacutil /i MiscInfo.dll
    

    このバージョンをグローバル アセンブリ キャッシュに追加する場合は 。

図 2 に示すように、Microsoft Windows® エクスプローラーを使用して winnt\assembly フォルダーを表示することで、両方のバージョンのプロジェクトが GAC に存在することを確認できます。

図 2. GAC の MiscInfo プロジェクトの 2 つのバージョン

MiscInfo プロジェクトは、単一の Version プロパティを持つ単一の Info クラスを実装します。 このプロパティは、FileVersionInfo オブジェクトを使用して、MiscInfo コンポーネントにコンパイルされるバージョン文字列を返します。 上記の手順に従って、2 つの異なるバージョンの文字列を返す 2 つの異なるバージョンのこのコンポーネントを作成しました。

ユーザー インターフェイス プロジェクトを作成するには

次の手順に従って Windows アプリケーションを作成し、MiscInfo プロジェクトのバージョンをテストします。

  1. Visual Studio .NET を開き、[ スタート] をクリックし、[ 新しいプロジェクト] をクリックします。

  2. 左側のウィンドウのツリー ビューで、[Visual Basic プロジェクト] を選択します。

  3. プロジェクト テンプレートとして [Windows アプリケーション] を選択します。

  4. アプリケーションの名前を InfoTest に設定し、[ OK] をクリックして プロジェクトを作成します。

  5. ソリューション エクスプローラー ウィンドウで、Form1.vb という名前のフォームを選択し、frmInfo.vb に名前を変更します。

  6. 表 1 で説明するように、適切なコントロールを追加し、それらのコントロールのプロパティを設定することで、1 つのコマンド ボタンを使用してフォームを作成します。

    表 1 フォーム コントロールとプロパティ

    コントロール型 プロパティ
    ボタン 名前 btnInfo
      Text Info
  7. [ プロジェクト ] メニューの [ 参照の追加] をクリックし、[ .NET ] タブをクリックし、[ 参照] をクリックして、バージョン 1.0.0.0 MiscInfo.dll参照します。 [OK] をクリックします。

  8. [表示] メニューの [コード] をクリックし、Windows フォーム Designer生成されたコードの後に次のコードを入力します。

        Private Sub btnInfo_Click( _
         ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles btnInfo.Click
            Dim i As New MiscInfo.Info()
            MessageBox.Show(i.Version)
        End Sub
    
  9. [ ビルド ] メニューの [ ソリューションのビルド ] をクリックして、InfoTest プロジェクトの実行可能バージョンを作成します。

  10. Windows エクスプローラーでInfoTest.exeを見つけてダブルクリックし、コンパイル済みバージョンのプロジェクトを実行し、[情報] をクリックします。 プログラムには、InfoTest プロジェクトが参照するバージョンのMiscInfo.dllのバージョン文字列である 1.0.0.0 が表示されます。

試してみる

実行時に内部バインディング情報をオーバーライドする機能をテストするには、次の手順に従います。

  1. [スタート] ボタンをクリックし、[プログラム]、[管理ツール] の順にクリックし、[Microsoft .NET Framework 構成] をクリックします。

  2. .NET Framework構成アプリケーションの左側のウィンドウで、[構成済みアセンブリ] ノードを選択します。

  3. 右側のウィンドウで、[ アセンブリの構成] をクリックします。

  4. [ アセンブリの構成 ] ダイアログ ボックスで、[ アセンブリの選択] をクリックします。

  5. [ アセンブリ キャッシュからアセンブリを選択 ] ダイアログ ボックスで、MiscInfo アセンブリのバージョン 1.0.0.0 を強調表示し、[ 選択] をクリックします。

  6. [ アセンブリの構成 ] ダイアログ ボックスで、[ 完了] をクリックします。 この MiscInfo プロパティ ダイアログ ボックスが開きます。

  7. [ バインド ポリシー ] タブをクリックします。[要求されたバージョン] に「1.0.0.0」と入力します。 [新しいバージョン] に「2.0.0.0」と入力し、[ OK] をクリックします。

  8. Infotest.exe アプリケーションを実行し、[ 情報] をクリックします。

    プログラムには、2.0.0.0 が表示されます。これは、最初にアプリケーションにバインドされたバージョンではなく、構成ファイルによって読み込まれたMiscInfo.dllのバージョンのバージョン文字列です。

Visual Basic 6.0 以降の新機能

バージョン情報の処理は、Visual Basic 6.0 以降大幅に変更されています。 特に次の点に違いがあります。

  • バージョン情報が AssemblyInfo.vb ファイルで設定されました。
  • バージョン情報は、AssemblyName クラスの GetAssemblyName メソッドを使用して取得されるようになりました。
  • アプリケーションにバインドされているバージョン情報は、実行時に構成ファイルによってオーバーライドできます。

まとめ

Microsoft .NET では、バージョン情報を非常に細かく制御できます。 既定では、アセンブリは、アセンブリのコンパイル時に使用できるコンポーネントのバージョンのみを使用します。 ただし、アプリケーションの開発者、コンポーネントの発行元、またはシステムの管理者は、このポリシーをオーバーライドし、コンポーネントごとに使用するバージョンを指定できます。

著者について

マイク・ガンダーロイは ソフトウェアについて書き、ワシントン州東部でニワトリを育てる。 Access 2002 Developer's Handbook の共同執筆者であり、Sybex 社の analysis Services を使用したSQL Server Developerの OLAP ガイドの著者です。 彼は、先史時代から Microsoft 製品のコードを作成しており、すぐに停止するつもりはありません。

情報伝達グループについて

インフォーマント・コミュニケーションズ・グループ(www.informant.com)は、情報技術分野に重点を置いた多様なメディア企業です。 ソフトウェア開発出版物、カンファレンス、カタログ発行、Webサイトを専門とするICGは、1990年に設立されました。 ICGは、米国および英国にオフィスを構え、質の高い技術情報に対する IT プロフェッショナルの高い意欲を満たす、メディアおよびマーケティング コンテンツ インテグレーターとして高い評価を受けています。

Copyright © 2002 Informant Communications Group and Microsoft Corporation

技術編集: PDSA, Inc. または KNG Consulting, Inc.