64bitに対応したユーザーコントロール(カスタムコントロール)を作成するには、前提条件として
Visual Studio はOSが64bitであっても32bitで動作している!
という点に注意しないといけません。
つまり、プラットフォームを64bitで作成したユーザーコントロールをVisual Studioのフォームデザイナでフォーム上に配置すると、32bitプログラムから64bitプログラムを呼び出す事になるので、フォームデザイナがエラーとなり、フォームを表示してくれません。
これを回避するためには、ユーザーコントロールのプラットフォームをAny CPUに設定して下さい。
この時点で、Any CPUの設定がないC++/CLIのユーザーコントロールは64bit対応ができないという事になります。
これを知らずにC++/CLIのユーザーコントロールを32bitである程度作成してしまい、64bitに対応させようと思った時に、エライ目に会いました...→結局、C#で作り直すハメに。
次に私がハマったのが、ユーザーコントロールからアンマネージのライブラリを呼ぶ場合の処理。
作成したプログラムのプラットフォームがAny CPUの時の挙動ですが、
32bitOSの場合:32bitのライブラリを呼び出す
64bitOSの場合:64bitのライブラリを呼び出す
となります。
つまり、64bitOS環境でユーザーコントロールを開発すると、Visual Studioで開発中にフォームデザイナでは、Any CPUのユーザーコントロールから、64bitのライブラリを呼び出そうとします。
ユーザーコントロールはフォームに配置した時点で、コントロールのプロパティやコンストラクタ、各種イベント処理が動いてしまうので、この時に64bitライブラリの関数が呼ばれてしまうと、フォームデザイナがエラーとなってしまいます。
これを回避するには、フォームがデザインモードかどうかを調べる
System.ComponentModel.Component.DesignModeプロパティ
を用います。
この値がtrueの場合、64bitライブラリの関数を呼び出さないようにすると、回避できます。
さらに話をややこしくするのが、DesignModeプロパティはコンストラクタや入れ子となったユーザーコントロールでは正しい値が取得できません。
そのため、DesignModeプロパティを取得する際には注意して下さい。
(参考)
まとめると、
●ユーザーコントロールはVB.NETもしくはC#でプラットフォームをAny CPUにして作成する。
●デザイン時に64bitライブラリの関数を呼び出さい。
という感じでしょうか?
VB.NETやC#だけで作るならプラットフォームは全てAny CPUにしておくと、あまり64bit対応の事は気にしなくても大丈夫ですね。
また、逆に32bit対応のライブラリしかなく、32bitで動くプログラムを作る場合は、64bit対応のライブラリが呼び出されないように、プラットフォームをAny CPUにはせずに、Win32に設定しておく必要があります。
コメント