none
カスタムコントロールをツールボックスから配置することが出来ない RRS feed

  • 質問

  • VisualStudio2008を使ったC++/CLIで、

    pictureboxに少し機能追加したコントロールを作りたいと思っています。

    メニューの「プロジェクト」→「クラスの追加」→「C++ クラス」を選択
    「基本クラス」に System::Windows::Forms::PictureBox と入力して
    「マネージ」のチェックボックスにチェックを入れてクラスを作り、PictureBoxを継承したクラスを作りました。

    ビルド後、ツールボックスに作成したコントロールが表示され(ギアのアイコン)
    ツールボックスからフォームへドラッグ&ドロップして、コントロールを配置しようとすると
    「ツールボックス 'PictureBoxEX'アイテムの読み込みに失敗しました。アイテムはツールボックスから削除されます。」
    というエラーがでて、なぜか配置することができません・・・。これはどうしたら解決できるのでしょうか?

    2012年4月17日 5:32

回答

  • VS2008 Pro SP1 で記述操作を行いコード修正なしで試してみましたが、問題なく動作しました。


    配置時エラーなのでコンストラクタコードが怪しいのですが、読込失敗のエラーメッセージなのでアセンブリからのロード時点で既に失敗してるようにも思えます。


    記載情報からだと、特におかしくなる所はないようなので、エラーがでない状態からやり直してエラー特定する作業を行うのが良いと思いますよ。

    • 回答の候補に設定 山本春海 2012年4月27日 10:41
    • 回答としてマーク 山本春海 2012年5月1日 7:44
    • 回答としてマークされていない BB-X LARISSA 2012年5月10日 11:05
    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:07
    2012年4月19日 7:41
  • その PictureBoxEx があるプロジェクトは、外部の自作 DLL、サードパーティーの DLL などに依存していませんか?

    デザイナでコントロールを貼り付ける際、コントロールを含むアセンブリを特定のディレクトリにコピーします。
    この際、依存関係が解決できないとか、特定の条件を満たす型を利用しているとツールボックスからの配置ができないように思います。

    ただ、”特定の条件”は絞り込みまでできていないので、何か凝ったことをしていないか、一度見直してみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答の候補に設定 山本春海 2012年4月27日 10:41
    • 回答としてマーク 山本春海 2012年5月1日 7:44
    • 回答としてマークされていない BB-X LARISSA 2012年5月10日 11:05
    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:07
    2012年4月19日 13:43
    モデレータ
  • 1からやり直してどこで配置できなくなるかを発見できれば1番良いのですが、既にコード量がかなり大きく1から作るのは作業量が膨大になってしまいます

    1からやり直すほどの手間をかけずに、内容を全部コメントアウトして初期状態と同コードの状態で動くのでしょうか?

    動くならコーディングの問題に限定できますが、動かないなら環境の問題も考えられます。

    後はエラーメッセージから 「アセンブリファイルをデザイナが読込できない」 状況にあると予想すると、

    1. コンパイル済みアセンブリが存在していない       -> コンパイルできない状態で前回生成済みアセンブリを削除した
    2. アセンブリを参照登録できていない                  -> 参照登録を行う
    3. ツールボックスの参照情報がおかしくなっている  -> 環境の問題なので、ツールボックス情報のリセットや再セットアップ?

    といったことが原因として考えられるぐらいでしょうか?

    削除されるとのメッセージなので消えているかも知れませんが、ツールボックスにコンポーネント表示されているならアイテムがどこのアセンブリファイルを参照しているか確認することをおすすめします。

    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:05
    2012年5月10日 8:52
  • 本アプリでは、OpenCVという画像処理ライブラリを使いたい関係で、ここは/clrに設定しなければならないのですが/clrを設定した場合はカスタムコントロールが使えなくなるのでしょうか?

    新しく作ったプロジェクトで実験すればわかるかと思いますが、/clr:pure → /clr とするだけでは、該当の現象は起きません。
    /clr → /clr:pure と変えたときに合わせて何か変化したのではないでしょうか。

    なお、先にも書きましたようにネイティブ DLL にリンクするようなアセンブリはデザイナに貼り付けるコントロールとは切り離した方がよいと思っています。理由としてはデザイナーで経験上トラブルが多いので…。
    (最悪、InitializeComponent で貼り付ければ逃げられるかもしれませんね)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月10日 16:03
    モデレータ
  • 新しく作ったプロジェクトで実験すればわかるかと思いますが、/clr:pure → /clr とするだけでは、該当の現象は起きません。
    /clr → /clr:pure と変えたときに合わせて何か変化したのではないでしょうか。

    Azulean さんの環境では問題なかったようですが、こちらの環境では該当の現象が発生しました。

    なので、

    本アプリでは、OpenCVという画像処理ライブラリを使いたい関係で、ここは/clrに設定しなければならないのですが/clrを設定した場合はカスタムコントロールが使えなくなるのでしょうか?

    について、「混合アセンブリではデザイナからは使えない」と思っていたのですが、何か方法があるのかもしれません・・・。

    とはいえ OpenCV を使うのなら「作業量が膨大」になる可能性が高いので Azulean さんと同意見です。

    なお、先にも書きましたようにネイティブ DLL にリンクするようなアセンブリはデザイナに貼り付けるコントロールとは切り離した方がよいと思っています。理由としてはデザイナーで経験上トラブルが多いので…。
    (最悪、InitializeComponent で貼り付ければ逃げられるかもしれませんね)

    今回の条件だけをみるとフォームのコンストラクタで自前で作成すれば逃げられる可能性が高いと思ってますが、根本的に書き方を変更する方がお勧めではあります。

    にしても、ちょっとした環境の相違で動くなら、混合アセンブリを使ってデザイナ対応のコンポーネントが作れそうなので、情報を知ってる方がいるなら教えて頂きたいものです・・・。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月11日 22:54
  • すみません。いろいろと訂正させてください。

    1. 一つの Windows Forms アプリケーションプロジェクトでは /clr と /clr:pure で動きが違う。/clr では貼り付けられないことをこちらでも確認しました。
    2. Windows Forms アプリケーション プロジェクトとは別に、Windows Forms コントロール クラスライブラリを作って両方 /clr にして、クラスライブラリ側に PictureBoxEx を作るとうまくいく。(前回投稿ではこの構成を元に /clr, /clr:pure の組み合わせテストを実施していた)
    3. 「InitializeComponent に書く」と書いていましたが、コンストラクタの誤りです。

    いろいろと混乱させてしまい、申し訳ありません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月13日 4:15
    モデレータ
  • Azulean さん情報ありがとうございます。

    こちらでもクラスライブラリ DLL のアセンブリに変更すれば、デザイナで正常に動作しました。

    結果から EXE 参照の場合に当該現象がでるようですので、クラスライブラリのプロジェクトにアセンブリを分けることで解決できるかもしれませんね。

    しかし、作成しようとしている 「外部DLL参照コンポーネント」 というのは、お勧めできないですよ。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:12
    2012年5月14日 3:54

すべての返信

  • Windows Forms および WPF では、デザイナ上でコントロールを配置した時点でコンストラクタが自動的に呼ばれます。

    おそらくその PictureBoxEX のコンストラクタ内で実行しているコードに問題があります。

    ホスト先のフォーム側で設定できるものは、デザイナまたはフォーム側のコンストラクタで設定するようにしてみてください。

    • 回答の候補に設定 山本春海 2012年4月27日 10:41
    • 回答としてマーク 山本春海 2012年5月1日 7:44
    • 回答としてマークされていない BB-X LARISSA 2012年5月10日 11:05
    2012年4月18日 15:57
  • VS2008 Pro SP1 で記述操作を行いコード修正なしで試してみましたが、問題なく動作しました。


    配置時エラーなのでコンストラクタコードが怪しいのですが、読込失敗のエラーメッセージなのでアセンブリからのロード時点で既に失敗してるようにも思えます。


    記載情報からだと、特におかしくなる所はないようなので、エラーがでない状態からやり直してエラー特定する作業を行うのが良いと思いますよ。

    • 回答の候補に設定 山本春海 2012年4月27日 10:41
    • 回答としてマーク 山本春海 2012年5月1日 7:44
    • 回答としてマークされていない BB-X LARISSA 2012年5月10日 11:05
    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:07
    2012年4月19日 7:41
  • その PictureBoxEx があるプロジェクトは、外部の自作 DLL、サードパーティーの DLL などに依存していませんか?

    デザイナでコントロールを貼り付ける際、コントロールを含むアセンブリを特定のディレクトリにコピーします。
    この際、依存関係が解決できないとか、特定の条件を満たす型を利用しているとツールボックスからの配置ができないように思います。

    ただ、”特定の条件”は絞り込みまでできていないので、何か凝ったことをしていないか、一度見直してみてください。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答の候補に設定 山本春海 2012年4月27日 10:41
    • 回答としてマーク 山本春海 2012年5月1日 7:44
    • 回答としてマークされていない BB-X LARISSA 2012年5月10日 11:05
    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:07
    2012年4月19日 13:43
    モデレータ
  • こんにちは、BB-X LARISSA さん。

    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    その後いかがでしょうか。みなさんからのアドバイスは確認されましたか?
    問題の切り分けに参考になる情報をいただいているようでしたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    回答くださったみなさん、アドバイスありがとうございます。

    いただいた情報の中で、解決に役立った投稿や、参考になる情報など有効な情報には回答としてマークすることをお願いしています。
    今後、同じ問題でこのスレッドを参照される方にも、有効な情報を活用いただけるかと思いますので、ご協力よろしくお願いいたします。

    一旦回答としてマークさせていただきましたが、もしまだ解決していない場合には、試したことやその後の状況など情報更新されると他にも情報を得られるかもしれません。
    _____________________
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2012年5月1日 7:48
  • 回答ありがとうございます

    PictureBoxEX のコンストラクタ内は空です

    2012年5月10日 6:31
  • 回答ありがとうございます

    1からやり直してどこで配置できなくなるかを発見できれば1番良いのですが、既にコード量がかなり大きく1から作るのは作業量が膨大になってしまいます


    2012年5月10日 6:32
  • 回答ありがとうございます

    外部DLLをすべて外してみましたが解決しませんでした

    2012年5月10日 6:32
  • 1からやり直してどこで配置できなくなるかを発見できれば1番良いのですが、既にコード量がかなり大きく1から作るのは作業量が膨大になってしまいます

    1からやり直すほどの手間をかけずに、内容を全部コメントアウトして初期状態と同コードの状態で動くのでしょうか?

    動くならコーディングの問題に限定できますが、動かないなら環境の問題も考えられます。

    後はエラーメッセージから 「アセンブリファイルをデザイナが読込できない」 状況にあると予想すると、

    1. コンパイル済みアセンブリが存在していない       -> コンパイルできない状態で前回生成済みアセンブリを削除した
    2. アセンブリを参照登録できていない                  -> 参照登録を行う
    3. ツールボックスの参照情報がおかしくなっている  -> 環境の問題なので、ツールボックス情報のリセットや再セットアップ?

    といったことが原因として考えられるぐらいでしょうか?

    削除されるとのメッセージなので消えているかも知れませんが、ツールボックスにコンポーネント表示されているならアイテムがどこのアセンブリファイルを参照しているか確認することをおすすめします。

    • 回答としてマーク BB-X LARISSA 2012年5月10日 11:05
    2012年5月10日 8:52
  • 回答ありがとうございます

    内容を全部コメントアウトして動かなかったので、環境を初期状態から比較していきましたところ、初期状態と環境の違いがありました

    プロジェクト>プロパティ>構成プロパティ>全般にある共通言語ランタイムサポートが「共通言語ランタイム サポート(/clr)」となっていました。

    これを、「純粋 MSIL 共通言語ランタイム サポート (/clr:pure)」に変更したところ、カスタムコントロールの貼り付けができました

    本アプリでは、OpenCVという画像処理ライブラリを使いたい関係で、ここは/clrに設定しなければならないのですが

    /clrを設定した場合はカスタムコントロールが使えなくなるのでしょうか?

    2012年5月10日 11:04
  • 本アプリでは、OpenCVという画像処理ライブラリを使いたい関係で、ここは/clrに設定しなければならないのですが/clrを設定した場合はカスタムコントロールが使えなくなるのでしょうか?

    新しく作ったプロジェクトで実験すればわかるかと思いますが、/clr:pure → /clr とするだけでは、該当の現象は起きません。
    /clr → /clr:pure と変えたときに合わせて何か変化したのではないでしょうか。

    なお、先にも書きましたようにネイティブ DLL にリンクするようなアセンブリはデザイナに貼り付けるコントロールとは切り離した方がよいと思っています。理由としてはデザイナーで経験上トラブルが多いので…。
    (最悪、InitializeComponent で貼り付ければ逃げられるかもしれませんね)


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月10日 16:03
    モデレータ
  • 新しく作ったプロジェクトで実験すればわかるかと思いますが、/clr:pure → /clr とするだけでは、該当の現象は起きません。
    /clr → /clr:pure と変えたときに合わせて何か変化したのではないでしょうか。

    Azulean さんの環境では問題なかったようですが、こちらの環境では該当の現象が発生しました。

    なので、

    本アプリでは、OpenCVという画像処理ライブラリを使いたい関係で、ここは/clrに設定しなければならないのですが/clrを設定した場合はカスタムコントロールが使えなくなるのでしょうか?

    について、「混合アセンブリではデザイナからは使えない」と思っていたのですが、何か方法があるのかもしれません・・・。

    とはいえ OpenCV を使うのなら「作業量が膨大」になる可能性が高いので Azulean さんと同意見です。

    なお、先にも書きましたようにネイティブ DLL にリンクするようなアセンブリはデザイナに貼り付けるコントロールとは切り離した方がよいと思っています。理由としてはデザイナーで経験上トラブルが多いので…。
    (最悪、InitializeComponent で貼り付ければ逃げられるかもしれませんね)

    今回の条件だけをみるとフォームのコンストラクタで自前で作成すれば逃げられる可能性が高いと思ってますが、根本的に書き方を変更する方がお勧めではあります。

    にしても、ちょっとした環境の相違で動くなら、混合アセンブリを使ってデザイナ対応のコンポーネントが作れそうなので、情報を知ってる方がいるなら教えて頂きたいものです・・・。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月11日 22:54
  • すみません。いろいろと訂正させてください。

    1. 一つの Windows Forms アプリケーションプロジェクトでは /clr と /clr:pure で動きが違う。/clr では貼り付けられないことをこちらでも確認しました。
    2. Windows Forms アプリケーション プロジェクトとは別に、Windows Forms コントロール クラスライブラリを作って両方 /clr にして、クラスライブラリ側に PictureBoxEx を作るとうまくいく。(前回投稿ではこの構成を元に /clr, /clr:pure の組み合わせテストを実施していた)
    3. 「InitializeComponent に書く」と書いていましたが、コンストラクタの誤りです。

    いろいろと混乱させてしまい、申し訳ありません。


    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:11
    2012年5月13日 4:15
    モデレータ
  • Azulean さん情報ありがとうございます。

    こちらでもクラスライブラリ DLL のアセンブリに変更すれば、デザイナで正常に動作しました。

    結果から EXE 参照の場合に当該現象がでるようですので、クラスライブラリのプロジェクトにアセンブリを分けることで解決できるかもしれませんね。

    しかし、作成しようとしている 「外部DLL参照コンポーネント」 というのは、お勧めできないですよ。

    • 回答としてマーク BB-X LARISSA 2012年5月23日 4:12
    2012年5月14日 3:54