5

Microsoft社のActiveX/COM(VB6)技術を利用したソフトウェアシステムを開発しました。昨年、私は自動化されたビルド プロセスと SCM 全体にますます興味を持つようになりました。COM ベースのソフトウェア システムで scm を実行する方法のベスト プラクティスに関する情報を求めて、Web の大部分を集中的に検索しました。

COM の「問題」は、参照コンポーネントが一意のインターフェイス ID によって参照を保持していることです。参照されたコンポーネントを再コンパイルすると、ID が変更され、参照が無効になる場合があります。ここでの主な問題は、iid がバイナリにコンパイルされることです。したがって、コンパイルされたファイルをバージョン管理にチェックインしたくない場合、すべての開発者は自分のバージョンをコンパイルして他の ID を取得する必要があります。

システムをコンパイルするためにクリーン ビルド マシンでソースをチェックアウトしたい場合、すべての参照が無効であるため (バイナリ ファイルもインターフェイス ID もありません)、それは不可能です。

COM プロジェクト (VB6) 用の自動ビルド システムをセットアップする方法を教えてください。

編集: はい、互換性設定を認識しています。しかし、バイナリを使用せずにクリーンなビルド マシンで wohle システムをビルドするシナリオを考えてみましょう。プロジェクトがバイナリ互換性があると言うときは、プロジェクトが互換性のあるバイナリを提供する必要があります。

プロジェクトをコンパイルする前後に、プロジェクト ファイルの参照と互換性設定を変更するカスタム ビルド ツールを作成する必要があると思います。

VB6 / COM は非常に広く普及しているテクノロジであるため、すぐに使用できるソリューションが必要であると考えていました。

通常、バイナリ互換でコンパイルします。コンポーネントのパブリック インターフェイスを変更する場合、プロジェクトの互換性でコンパイルします。しかし、他の多くのコンポーネントで使用される基本的なコンポーネントのインターフェイスを変更する場合、参照しているすべてのプロジェクトをプロジェクトの互換性に手動で変更し、それらを再コンパイルして、バイナリ互換性に戻す必要があります。それが私が自動化したい主なプロセスです。

4

3 に答える 3

11

プロジェクトの互換性設定を「互換性なし」から「バイナリ互換性」に変更することで、GUID(IIDのCLSIDのLIBIDなど)を再利用するようにVB6に指示できます。これらの設定は、[プロジェクト]->[あなた]-[プロジェクトのプロパティ]にあります。互換性の設定は、[プロジェクトのプロパティ]ウィンドウの[コンポーネント]タブにあります。3つの選択肢があります。

  • 互換性なし
  • プロジェクトの互換性
  • バイナリ互換性

これがMSDNがそれらについて言っていることです:

互換性なし


この設定では、互換性は強制されません。Visual Basicは、プロジェクトをビルドまたはコンパイルするたびに、新しいインターフェイスIDとクラスIDを作成します。ビルドされた各バージョンは、コンポーネントの特定のビルドで動作するように作成されたアプリケーションでのみ使用できます。

プロジェクトの互換性


この設定を使用すると、プロジェクトを特定のコンポーネントプロジェクトと互換性のあるものにすることができます。新しいタイプライブラリ情報が生成されている間、テストプロジェクトがコンポーネントプロジェクトを参照できるように、タイプライブラリ識別子が維持されます。この設定は、テスト中に互換性を維持するためのものです。したがって、コンポーネントが解放されると、互換性なしの設定と同じように動作します。

バイナリ互換性


プロジェクトをコンパイルすると、VisualBasicは必要な場合にのみ新しいクラスIDとインターフェイスIDを作成します。以前のバージョンを使用してコンパイルされたプログラムが引き続き機能するように、以前のバージョンのクラスIDとインターフェイスIDが保持されます。互換性のないバージョンになるような変更を加えた場合、VisualBasicは警告を表示します。ActiveXコンポーネントの古いリリースバージョンとの互換性を維持したい場合は、これが使用する必要のある設定です。

現在、互換性なしでコンパイルしているようです。MSDNの記事に記載されているように、コンポーネントの新しいバージョンと古いバージョンの互換性を維持するには、バイナリ互換性を使用する必要があります。次の手順を実行することで、これを実行できます。

  • 互換性なしで各プロジェクトを1回コンパイルします

  • これらの「クリーンな」バージョンを、ネットワーク共有など、ビルドを実行するユーザーが簡単にアクセスできるフォルダーに保存するか、ソース管理に配置します。

  • 戻ってすべてのプロジェクトを「バイナリ互換性」に変更し、「互換性ファイル」をネットワーク/ソース管理に保存したばかりの対応するバージョンにポイントします(互換性ファイルをコンパイルしているのと同じパスにポイントしないでください互換性のあるファイルは、変更されない元のコンポーネントの別のコピーである必要があります。これは、VBが再コンパイル時にそのファイルからプロジェクトにIDをコピーできるようにするためにのみ存在します)。

プロジェクトを再コンパイルするたびに、互換性のある(元の)バージョンのコンポーネントのGUIDが再利用されます。

編集:ジョーがコメントで述べたように、クラスインターフェイスが変更されたとき(つまり、以前のバージョンとのバイナリ互換性を維持できるほどインターフェイスが変更されたとき)も認識する必要があります。これが発生した場合は、以前のバージョンのコンポーネントから完全に切り離す必要があります。新しい「クリーンな」バージョン(つまり、互換性なし)を再コンパイルし、その新しいバージョンを将来のビルドで互換性のあるファイルとして使用します。ただし、クラスインターフェイス(プロパティとメソッド)が変更された場合にのみ、最初からやり直す必要があることに注意してください。実際、プロジェクトが以前のバージョンのコンポーネントと互換性がなくなった場合、VBは警告を表示します。

あなたが端に住みたいなら...


私が働いている場所では、実際には正しい方法ではありませんが、ほとんどのプロジェクトで互換性なしを(乱用)使用する傾向があります(バイナリ互換性を使用する必要があります)。私たちの会社では、すべてのプロジェクトをコンパイルする自動ビルドツールがあり、ツールの主な機能の1つは、プロジェクト間の壊れたプロジェクト参照を自動的に修復できるため、怠惰になりました。ビルドツールがこれを修正するため、バイナリ互換性を使用するインセンティブが少なくなります。

バイナリ互換性が優れている理由(または...私たちがやるべきことをやるべきではない理由)


バイナリ互換性が通常より良い選択であるいくつかの理由:

  • マイクロソフトはそう言います

  • すべてのコンポーネントが以前のリリースのソフトウェアとバイナリ互換である場合は、単一のコンポーネントを簡単に再コンパイルして、顧客に再配布できます。これにより、バグ修正/パッチの展開が容易になります。プロジェクトで互換性なしを使用する場合、新しいコンポーネントは(おそらく)古いコンポーネントでは機能しないため、小さなパッチを送信する必要があるたびに、アプリケーション全体を再コンパイルして再配布する必要があります。

  • あなたはCOM標準を維持するために自分の役割を果たしています。COMでは、クラスIDとインターフェイスIDは、クラスまたはインターフェイスを一意に識別することになっています。クラスやインターフェイスがビルド間で変更されていない場合、それらのクラスやインターフェイスの新しいIDを生成する理由はありません(実際、同じクラスに複数のIDがあります)。Binary Compatiblityを使用すると、ビルド間で同じIDを維持できます。つまり、良き市民であり、COMの規則に従っています。

  • レジストリノイズが少ない。古いバージョンとバイナリ互換ではない顧客に常に新しいコンポーネントを展開している場合、新しいバージョンごとに新しい情報がレジストリに追加されます。特に、新しいインターフェイスとクラスIDはそれぞれ登録する必要があります。すべてをバイナリ互換に保つ場合、クラスIDとインターフェイスIDは変更されないため、インストーラーはレジストリキーを1か所に追加するだけで済みます。

  • 他のサードパーティアプリケーションが消費しているパブリックAPIまたはコンポーネントを公開している場合は、コードに依存するサードパーティソフトウェアを壊さないように、バイナリ互換性を使用することをお勧めします。

于 2008-10-07T18:01:52.293 に答える
5

ビジュアルビルドプロ。まだ VB6 の領域に行き詰まっていて、プロフェッショナルな製品を構築する必要がある場合は、この製品を検討することを強くお勧めします。無料の試用版があり、1 セントの価値があります (さらに、.Net やその他のプラットフォームの継続的インテグレーションが非常にうまく機能します)。これを使い始めて以来、すべてのリリースで DLL 地獄から救われてきました。VB6 で適切なビルド ボックスを作成する方法は他にありません。

于 2008-10-08T16:33:01.830 に答える
4

Mike Spros が示唆するように、バイナリ互換性を使用する必要があります。クリーンなマシンでビルドできます (またそうすべきです)。これを行うには、ソース管理システムの「互換性のある」ディレクトリに現在の本番バイナリ (ActiveX DLL および OCX) のコピーを保持します。Binary Comatibility を選択すると、すべてのプロジェクトがこのコピーを参照する必要があります。たとえば、新しいバイナリを ...\Release に配置し、互換性のあるバイナリを ...\Compatible に配置します。新しいバージョンが本番環境に入ったら、...\Release から ...\Compatible にすべてをコピーします。このようにして、あるリリースから次のリリースへと互換性を保ちます。

バイナリ互換モードの場合、クラスに新しいメソッドを追加すると、VB は新しい IID を作成します。COM ではインターフェイスは不変であることに注意してください。インターフェイスにわずかな変更を加えると、何か新しいものを作成することになります。VB は、COM のこのルールに従いますが、古いクライアント コードの破損を防ぐために、いくつかのスモークとミラーを使用します。VB は、新しいインターフェイスが古いインターフェイスの 100% のスーパーセットであることを "認識" しているため (これがバイナリ互換性を保証するものです)、"インターフェイス転送" を使用できます。インターフェイス転送は、古いインターフェイスから新しいインターフェイスにすべての参照をリダイレクトするだけです。このトリックがなければ、変更する ActiveX コンポーネントの新しいバージョンを (別の名前と CLSID で) 作成する必要があります。DLL Hell は DLL Armargeddon に変わります!

VB は、すべてのインターフェイス転送情報をコンポーネントのリソースに保存します。コンポーネントを登録すると、すべてのインターフェイス IID が HKCR\Interface に書き込まれます。古いインターフェースには転送情報が含まれます。「実際の」インターフェイスのみが実際のコクラスを参照します。

于 2008-12-17T06:46:49.367 に答える