はじめに

COM DLLを参照する.NETプロジェクトに取り組む際、プロジェクトがinterop DLLの正しいバージョンを維持することが重要です。これは互換性の追跡だけでなく、アプリケーションがアップデートやパッチを通じてシームレスに機能することを保証するためにも不可欠です。この記事では、.NET環境におけるCOM DLL参照のバージョン管理の方法と一般的な落とし穴について探ります。

直面している問題

Visual Studioを使用してCOM参照を追加する際に問題が発生します。デフォルトでは、割り当てられるバージョンが元のCOM DLLのバージョンと一致しない場合があります。この不一致は、パッチが関与する場合に特に困難を引き起こす可能性があります。以下のような疑問が浮かぶかもしれません:

  • 作成されたinterop DLLが正しいバージョンであることをどう確認できますか?
  • メジャーおよびマイナーのバージョンに加えてビルド番号を組み込む方法はありますか?

それでは解決策に入りましょう!

COM参照のバージョンを理解する

解決策に取り掛かる前に、バージョン管理がどこから来るのかを理解することが重要です:

  1. タイプライブラリ (TypeLib): COMでは、バージョン管理は主にDLLそのものではなく、Type Libraryに関連付けられています。GUIDはTypeLibを参照し、バージョン番号はそのTypeLibのVersionMajorとVersionMinor属性に対応します。

  2. レジストリストレージ: バージョン番号は、Windowsレジストリの以下の場所に保存されます:

    HKEY_CLASSES_ROOT\Typelib\{typelib uuid}\Major.Minor
    

    ここでメジャーバージョンは何かでなければならず、マイナーバージョンはゼロに設定でき、これにより最新の一致するバージョンをインポートします。

COM DLLのバージョン管理手順

1. DLLではなくType Libraryを参照する

COM DLLを直接参照するのではなく、Type Libraryを参照してください。こうすることで、関連付けられたバージョン管理を引き継ぎます。TlbImpを使用する際は、必要なバージョンを指定するために/asmversionフラグを含めることを確認してください。

2. Visual Studioでバージョンを設定する

Visual Studioを使用して手動でバージョンを設定するには、.vcprojファイルを編集することが役立ちます。以下はガイドとなる例です:

<ItemGroup>
    <COMReference Include="MYDLLLib">
        <Guid>{459F8813-D74D-DEAD-BEEF-00CAFEBABEA5}</Guid>
        <VersionMajor>1</VersionMajor> 
        <VersionMinor>0</VersionMinor> 
        <Lcid>0</Lcid>
        <WrapperTool>tlbimp</WrapperTool>
        <Isolated>False</Isolated>
    </COMReference>
</ItemGroup>

3. レジストリ設定の確認

変更を加えた後、新しいバージョン番号がレジストリに正しく表示されていることを確認します。この確認ステップは、アプリケーションがアップデートを通じて正常に機能し続けるという安心感を提供します。

4. バージョン管理の制限

残念ながら、バージョンシステムはメジャーおよびマイナーのバージョン番号のみをサポートし、ビルドバージョンは含まれていません。これはあなたのTypeLibに関連付けられたIDLファイルによって決まります。より細かいバージョン情報が必要な場合は、プロジェクト管理システムで命名規則に従うことを検討してください。

結論

.NETプロジェクトで参照されるCOM DLLからのinterop DLLが正しいバージョンを維持することは複雑ですが、上記の手順に従うことで、より管理しやすいアプローチを実現できます。重要なのは、DLLのバージョンではなくTypeLibのバージョンに焦点を当て、変更後にレジストリ設定を確認することです。

これらの方法を使用することで、バージョンの不一致によるフラストレーションを回避し、更新をスムーズにし、パッチを通じてアプリケーションの整合性を維持することができます。

COM DLLのバージョン管理に関してさらなる質問や洞察がある場合は、ぜひあなたの経験を共有してください!