web-dev-qa-db-ja.com

ユーザーコントロールをフォームに配置できません

VS2010を使用してC#WinFormsアプリケーションを作成しました。ユーザーコントロールの作成は初めてなので、新しいユーザーコントロールを(同じプロジェクトの一部として)作成しました。

プロジェクトを再ビルドすると、新しいコントロールがツールボックスに表示されます。そして、ツールボックスからフォームにコントロールをドラッグすると、次のエラーが発生します。

ツールボックスアイテム 'TagGroup'を読み込めませんでした。ツールボックスから削除されます。

これは、ユーザーコントロールを作成した他の唯一の時間です。私はWebを検索しましたが、見つかったほとんどの回答は、別のアセンブリにコントロールがあることに関連しているようです。 (私が抱えているのと同じ問題について多くの質問が見つかりました。)

誰が私が次にどこを見ればよいかを提案できますか?

34
Jonathan Wood

私はついにこれを見つけました。

私が作業しているプロジェクトでは、2つのクラスライブラリアセンブリを使用しています。これらは、私が議論しているコントロールとは何の関係もありませんが、両方のライブラリを見て、[プロパティ|ビルド]タブの[プラットフォームターゲット]が[任意のCPU]に設定されていることを確認しました。

一方、私のアプリケーションでは、この設定を「x64」に設定しています。アプリケーションの設定を「すべてのCPU」に変更することで、ユーザーコントロールをフォームに配置できるようになりました。

図に行く...

33
Jonathan Wood

私のアプリケーションは64ビットである必要があります。デザイナーでカスタムユーザーコントロールを使用するために、新しいプロジェクトをソリューションに追加しました。この新しいプロジェクトは「AnyCPU」設定を使用し、すべてのユーザーコントロールが含まれています。

私のソリューションには次のプロジェクトが含まれています。

  • MyAppこれは64ビットでコンパイルされたメインプロジェクト(Windowsフォームアプリケーション)ですと私の2番目のプロジェクトを参照
  • MyApp.UI.UserControls(クラスライブラリ)は、「Any CPU "と私のすべてのユーザーコントロールが含まれています

魅力のように機能し、それはきれいです


ちなみに、この問題について Microsoftサポート記事 があります。

  • アクション:Microsoft Visual Studio統合開発環境(IDE)内で64ビットコンポーネントを使用しようとしました。
  • エラー原因:この動作は仕様です。 Visual Studioは32ビットプロセスであるため、32ビットモジュールのみを実行できます。 Visual Studioでは64ビットアセンブリへの参照を追加できますが、実際にそれをJITで64ビットアセンブリにコンパイルして実行することはできません。
  • 解決:
    1. 「AnyCPU」設定を使用してアセンブリを再構築します。これにより、コンポーネントを32ビットプロセス(Visual Studioなど)または64ビットプロセスで実行できます。
    2. 参照としてアセンブリを追加し、実行時にコントロールを動的に読み込みます。 Visual Studio内のどのデザイナー内でもコントロールを使用することはできませんが、コントロールをインスタンス化し、それに応じてプロパティを設定するために必要なコードを書くことができます。

ソース:http://support.Microsoft.com/kb/963017

34
Yves M.

私もこの問題を抱えていましたが、答えは私には合いませんでした。私のプロジェクトには、x86とx64を別々にしかターゲットにできないいくつかの問題があります。言い換えると、AnyCPU構成を使用できません(AnyCPUにライブラリが適合しないため、構成ごとに異なるライブラリを参照しているためです)。

私が思いついた解決策は、フォームデザイナーを使用する必要があるときに、設定をx86に変更することでした。ジョブを実行してから、x64に戻してテストします。問題はデザイナでのみ発生しますが、ソリューションは正常にビルドおよび実行されます。

6
Daniel Möller

私はVS2015でこの問題があり、解決策は単純であることがわかりました。

(カスタムコントロールにグループ化する目的で)フォームからいくつかの既存のコントロールをカットアンドペーストしてユーザーコントロールを作成しました。カスタムコントロールは問題ありませんでしたが(コンパイルエラーはありません)、既存のフォームからコントロールを削除すると、アプリケーションがコンパイルされなくなりました。もちろん、新しいコントロールを追加できないことは、以前のコントロールを参照するコードをカスタムコントロールを参照するコードで更新できなかったことを意味します。

私がしたのは、ハッキングとスラッシュ(コメントアウト、一時的なコントロールの作成など)だけでした。これにより、アプリケーション全体がコンパイルされます。コンパイルした後、カスタムコントロールをフォームにドラッグできることがわかりました(この質問を引き起こしたエラーはありません)。次に、コードを適切に参照して新しいカスタムコントロールを参照できるように、ハックとスラッシュを解除する必要がありました。

4
Andrew Jens

ここでも同じ問題。 x64 OSにインストールされたVS2010が依然として32ビットプログラムであるという事実に関連していると思います。

別の解決策として、TheFormThisUserControlIsSupposedToBeAddedTo.Designer.csを開き、コードを使用してユーザーコントロールを追加する方法があります。基本的に、あなたはデザイナーがすることになっている汚い仕事をしています。

特に思ったほど難しくはありません。そのファイルにはおそらく多くのサンプルコードがすでにあることを考慮してください(例:Designerを使用して追加したボタン)。唯一の難しい部分は、コントロールを配置するためにフォーム内の正しい座標を理解することです。

最終的には、Desingerでユーザーコントロールを表示できなくなりますが、デバッグ/実行時に追加されます。

2
lznt

午前1時36分、1時間の混乱した疲れたトラブルシューティングは、翌日も新鮮な心で簡単に解決できます。
コントロールのファイル名の単純なスペルミスを修正したので、UserControl名と一致し、クリーンアップおよび再構築されて、奇妙な叔父の猫をボブスしました。 :]

0
n00dles

私もこの問題を経験しましたが、原因は異なりました。私の場合、コンポーネント(フォーム)コンストラクターまたはLoadイベントが、リフレクションを使用して特定のインターフェイスを実装するすべてのクラスを見つけるメソッドを呼び出しました。

これは実行時に正常に機能しますが、設計時に上記の例外が生成されました。 (タイプ例外を内部例外として持つタイプ初期化例外)。

0
Lord of Scripts