異なるバージョンのアセンブリを切り替えて使用する

ComponentOne Studioは、大きく年3回のメジャーアップデートと、不定期でのマイナーアップデートが提供されることもあり、それぞれのアセンブリには複数のバージョンが存在します。一般的には、最新バージョンが最も高機能で動作が安定しており、弊社としても常に最新版へのアップデートを行った上でのご利用をお勧めしております。

しかしながら、特定の案件においては、使用するアセンブリのバージョンが厳密に定められており、やむを得ず古いアセンブリバージョンを使用したままでプロジェクトのメンテナンスを継続しなければならない場合があります。複数のプロジェクトがそれぞれ異なるバージョンのアセンブリを使用しており、メンテナンスの都度、参照するアセンブリを切り替えなければならない、といったこともあり得るかもしれません。

アセンブリの参照先の切り替えは意外に面倒

このような場合、プロジェクトごとに独立した開発環境を用意できるのは稀で、多くの場合は1つの開発環境内で複数のプロジェクトをメンテナンスすることになります。

しかし、単純にアセンブリの参照先を変えただけだと、設計時にそれぞれのコントロールが備えるスマートデザイナ機能が正しく動作しなかったり、アセンブリバージョンの不一致によるビルドエラーが発生するなど、動作が不安定になることがあります。これは、暗黙的な依存アセンブリ(本体アセンブリに対するデザイナアセンブリなど)の参照先が、明示的に指定した参照先と異なる場合に起こることがあります。

本体アセンブリと依存アセンブリの参照先が一致するようにVisual Studioを設定するために、毎回製品のアンインストールと再インストールを行う必要があるかもしれません。また、Visual Studioツールボックスに手動でコントロールを登録していた場合、それらのアセンブリ参照先は自動では更新されないため、アセンブリ参照の切り替えの度に毎回再登録しなおさなければなりません。

このように、アセンブリの参照先を切り替えるのは単純ではなく、どうしても面倒になりがちです。

面倒な手順を必要としない、いい方法はないの?

実は、ある程度レジストリ操作に精通されている方であれば、参照するアセンブリの切り替えを容易に行う方法があります。これは、下記リンク先(MSDN)で説明しているデザイン時アセンブリの配置方法が関係します。

カスタム コントロールとデザイン時アセンブリの配置

この仕組みを利用することで、アセンブリの参照の追加やツールボックスへの登録において、カスタムコントロールを標準のコントロールと同等に扱うことができるようになります。ComponentOne Studioのインストーラにおいても、この方法を利用してアセンブリの参照先をVisual Studioに認識させたり、一部のエディションにてツールボックスへの自動登録を行っています。

以降のセクションにて、そのメカニズムと、それを応用してアセンブリの切り替えを容易に行う方法を紹介します。

注意
以降の説明では、レジストリの操作を伴う手順が含まれます。WindowsシステムレジストリはOSにとって非常に重要な情報であり、システムの動作に大きく影響を及ぼします。誤って操作してしまうと、コンピュータが動作しなくなるなど重大な問題を引き起こす恐れがあるため、取り扱いには細心の注意が必要です。
弊社では、レジストリを操作したことによる結果で生じた問題に対し、一切保証はいたしかねます。レジストリの操作にあたっては完全にお客様の責任の下で行ってください。不測の事態に備え、レジストリを編集する際には、あらかじめレジストリキーをバックアップしておくことをお勧めいたします。

Visual Studioアセンブリおよびコンポーネントを認識するメカニズム

通常、Visual Studioツールボックスアセンブリを登録する際には、「ツールボックスアイテムの選択」ダイアログを開いて一覧内から目的のコンポーネントを選択します。

f:id:ComponentOne_JP:20170801141657p:plain

Visual Studio IDEがこの一覧内に表示するアセンブリやコントロールの参照パスは、レジストリHKEY_LOCAL_MACHINE\SOFTWARE\x86環境)あるいは HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\(x64環境)配下の以下のエントリに記載されている既定値(文字列値)が示すパス情報が基になっています。

Microsoft\.NETFramework\<アセンブリバージョン>\AssemblyFoldersEx\<任意のエントリ名>

そのため、カスタムコントロールを一覧内に表示させるには、そのカスタムコントロールのパス情報を上記エントリの配下に登録すればいいことになります。

例えば、ComponentOne Stuidio for WPFがインストールされている場合、アセンブリの参照パスは以下のようなレジストリエントリで登録されています。

x86環境

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF]
@="C:\\Program Files\\ComponentOne\\Studio for WPF\\bin\\v4"

x64環境

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF]
@="C:\\Program Files (x86)\\ComponentOne\\Studio for WPF\\bin\\v4"

これにより、ComponentOne Stuidio for WPFのコントロールは、標準コントロールと同じようにアセンブリ一覧内に表示されており、アセンブリ参照の追加やツールボックスへの登録が簡単に行えるようになっています。

Visual Studioツールボックスにタブおよび項目が自動登録されるメカニズム

前のセクションで説明したアセンブリ固有のエントリに対して、ToolBoxという名前のサブエントリを作成することができます。また、ToolBoxサブエントリに対し、TabNameという名前の文字列値を追加し、それによってタブ名を指定することができます。

これらのサブエントリおよび文字列値が存在すると、Visual Studioは自動的に指定された名前のタブをツールボックス上に作成します。また、このエントリが示す参照パスに存在するすべてのアセンブリファイルを検証し、ツールボックスに登録可能なコンポーネントを抽出し、作成されたタブ内の項目としてそれらを追加します。

ComponentOne Studioのインストーラでは、ツールボックスWPF製品のコントロールを登録するにあたり、上記ToolBoxサブエントリ、およびTabName文字列値の登録のみを行っています。実際のツールボックスへの登録処理は、Visual Studio IDEによって自動的に処理されています。その結果、以下のようにツールボックスへの自動登録が行われています。
f:id:ComponentOne_JP:20170801153010p:plain

なお、ToolBoxサブエントリ内に新しいキーや値が追加されると、Visual Studioはそのエントリのキャッシュを更新します。つまり、アセンブリの参照先を切り替える都度、何らかの値をToolBoxサブエントリ内に追加すれば、ツールボックス内の項目も常に新しい参照先に更新されるようになります。

これらを応用し、アセンブリの参照先を容易に切り替えるには

それぞれのメカニズムを応用することで、アセンブリの参照先を容易に切り替えることができます。

一例として、それぞれのアセンブリバージョンごとに、レジストリの更新内容を定義した*.regファイルを用意しておき、アセンブリの参照先を切り替える際には、その*.regファイルを使用してレジストリを更新する、といった方法が考えられます。

以下に、この方法を使用するための手順を示します。

  1. 製品のインストール先にあるBinフォルダおよびそれに含まれるコンテンツ(サブフォルダも含む)を、フォルダごと他の場所(例;C:\Assemblies\ など)に退避します。
  2. 退避先のBinフォルダ名を、管理しやすい別の名前(例:「2017Jv2」 など)に変更します。
  3. 切り替えたいバージョンのアセンブリそれぞれに対して、上記手順を繰り返します。
  4. アセンブリのバージョンごとに、以下のような内容の*.regファイルを作成します。赤色の部分はそれぞれ任意に変更可能です。Update文字列値は、Visual Studioによってこのエントリのキャッシュが更新されるようにするために追加したオプション値です(バージョンごとに異なる文字列を指定します)。

x86環境

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF]
@="C:\\Assemblies\\2017Jv2"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF\ToolBox]
"TabName"="C1 WPF 4.0"
"Update"="2017Jv2"

x64環境

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF]
@="C:\\Assemblies\\2017Jv2"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1StudioWPF\ToolBox]
"TabName"="C1 WPF 4.0"
"Update"="2017Jv2"

事前に準備するのはこれだけです。

あとは、実際にアセンブリを切り替える際に、対応する*regファイルをダブルクリックするか、コンテキストメニューの「結合」を選択し、*.regファイルの内容をレジストリに結合してからVisual Studioを起動します。

なお、この方法により、ComponentOne Studioのインストーラではツールボックスの自動登録を行っていないWinFormsエディションのアセンブリについても、ツールボックスへの自動登録が行われるようレジストリを設定することが可能になります。

利用にあたっての注意点

AssemblyFoldersEx 配下に独自のエントリを追加する際には、あるアセンブリの同一あるいは複数のバージョンが同時に参照されないようご注意ください。例えば、2017Jv1と2017Jv2のアセンブリ参照に対するエントリが複数同時に登録されていると、アセンブリバージョンの競合が発生し、Visual Studioの動作が不安定になる要因となります。必ずいずれかのアセンブリバージョンのみが参照されるようにしてください。

補足:ComponentOne Studio for WinForms

ComponentOne Studio for WinFormsの.NET Framework 4.x用アセンブリでは、本体アセンブリとデザインアセンブリが分離していることから、それぞれのアセンブリに対してAssemblyFoldersEx内にエントリを登録しています。

x86環境

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1 WinForms]
@="C:\\Program Files\\ComponentOne\\Studio for WinForms\\bin\\v4"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1WinFormsDesigner]
@="C:\\Program Files\\ComponentOne\\Studio for WinForms\\bin\\v4\\Designer"

x64環境

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1 WinForms]
@="C:\\Program Files (x86)\\ComponentOne\\Studio for WinForms\\bin\\v4"

[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0.30319\AssemblyFoldersEx\C1WinFormsDesigner]
@="C:\\Program Files (x86)\\ComponentOne\\Studio for WinForms\\bin\\v4\\Designer"

本体アセンブリの参照パスを切り替える場合は、同様にデザイナアセンブリのパスについても切り替えが必要です。この際、本体アセンブリとデザイナアセンブリのバージョンが一致しなければならない点にご注意ください。

補足:ComponentOne Studio for WinRT/UWP

WinRT版およびUWP版のアセンブリは、上記で紹介したものとは異なる方法でアセンブリの参照先およびツールボックスへの自動登録を行っているため、同様の方法によってアセンブリ参照先の切り替えをおこなうことはできません。

\  この記事をシェアする  /