无法在窗体上放置用户控件

37

我使用VS2010创建了一个C# WinForms应用程序,现在想要创建一个新的用户控件(在同一项目中)。但是,由于我不熟悉创建用户控件,当我将新的控件拖到表单上时,会出现以下错误:

无法加载工具箱项“TagGroup”,该项将从工具箱中删除。

这已经是我第二次创建用户控件时出现这种情况了。我在网上搜索过,但大多数答案都似乎与将控件放在单独的程序集中有关。(注意,我找到了很多遇到我同样问题的人提出的问题。)

请问有什么建议或者下一步我应该去哪里寻找解决方法?


1
展示一些代码会有所帮助。至少向我们展示类声明和构造函数,虽然整个类将是最有帮助的。 - user203570
2
隔离这个问题。当一个空的UserControl没有任何内容时,它是否会发生=>这是VS的问题。如果没有问题,请注意在设计时运行的代码。 - Hans Passant
你在构造函数里做了什么吗?如果我没记错,设计师会调用它,所以最好不要在其中进行任何外部调用。 - Austin Salonen
1
@Mathew:没有代码!我解释了我做了什么。没有其他的了。 - Jonathan Wood
@Hans:这与代码无关,只是为了消除所有疑虑,我创建了另一个用户控件,什么也没做,只是重新构建了项目。完全相同的结果。如上所述,这种情况以前发生过。对我来说从来没有起作用过。 - Jonathan Wood
@Austin:我什么也没做。有一个控件的位置出了问题。 - Jonathan Wood
8个回答

35

我的应用程序需要是64位的。为了在设计器中使用自定义用户控件,我只需向解决方案添加一个新项目。这个新项目使用“AnyCPU”设置,并包含所有我的用户控件。

我的解决方案包含以下项目:

  • MyApp 是我的主要项目(Windows窗体应用程序),编译为64位,并引用我的第二个项目
  • 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


1
很遗憾,我的应用程序和所有控件都必须是x64,因为它们使用本机类型 :( 他们真的应该让VS支持x64! - NightElfik
2
是的!!! 我没有其他选择,只能使用x64来构建我的AutoCAD。之前的解决方案都不起作用!此外,在这个崩溃和燃烧之前,如果我必须对那个给定的表单进行修改,我必须每次都进入设计师并进行微调...这个方法完美无缺!是的! - Alex
仅作为警告,这个x64 /用户控件问题可能是由于用户控件上的一个字段设置为从64位程序集加载的常量最好不要在UserControl上使用来自x64 dll的任何内容。 - jrh

33

我终于弄明白了。

我正在处理的项目使用了两个类库程序集。虽然它们与我所讨论的控件无关,但我查看后发现这两个库都在“属性|生成”选项卡中设置了平台目标为“Any CPU”。

另一方面,我的应用程序将此设置设置为“x64”。通过将我的应用程序设置更改为“Any CPU”,我现在可以将我的用户控件放置到我的表单上。

去理解吧...


1
真奇怪,这个症状竟然源于那个问题,但对我也起作用了!谢谢。+1 - BenSwayne
请注意,如果控件所在的类库中的.NET框架高于您的项目,则会发生同样的情况。这是有道理的,但IDE应该只是说“嘿,这个控件在.NET 4.5.1 dll中 - 将您的项目升级到.NET 4.5”,而不是悄无声息地失败。 - edhubbell

6

我也遇到了这个问题,但是该答案并不能完全解决我的问题。我的项目存在一些问题,只能针对x86和x64进行独立的目标设置。换句话说,我无法使用 AnyCPU 配置(因为我为每个配置引用不同的库,由于这些库不适合 AnyCPU)。

我想出的解决方案是:当我需要使用窗体设计器时,我将设置更改为 x86。完成工作后,将其设置回 x64 并进行测试。问题仅发生在设计器中,但解决方案可以成功构建和运行。


4
我在VS2015中遇到了这个问题,但解决方案很简单。
我通过从一个表单中剪切和粘贴一些现有的控件来创建用户控件(旨在将它们分组到自定义控件中)。自定义控件没问题(没有编译错误),但是从现有表单中删除控件意味着应用程序无法编译。当然,无法添加新控件意味着我无法使用代码引用之前的控件更新为引用自定义控件的代码。
我所做的就是粗暴地修改(注释、创建临时控件等),以便整个应用程序都能编译。编译后,我发现可以将自定义控件拖动到表单上(而不会出现提示此问题的错误)。然后我必须取消修改,确保代码正确地引用新的自定义控件。

对我有用,使用x86配置重新编译后,现在可以添加用户控件。 - Ben Winding
如果你第一次放弃构建时遇到了构建错误,那么问题将一直存在,直到你进行成功的清理重建。 - Yong

2

我也有同样的问题。我猜测这与在x64操作系统上安装的VS2010仍然是一个32位程序有关。

另一种可能要尝试的替代解决方案是,简单地打开TheFormThisUserControlIsSupposedToBeAddedTo.Designer.cs并使用代码添加用户控件。基本上,您正在做设计师应该做的脏活。

这并不像听起来那么难,尤其是考虑到该文件中可能已经有大量示例代码(例如您使用设计器添加的按钮)。唯一困难的部分是找出在表单中放置控件的正确坐标。

最终结果是您不能在Desinger中看到用户控件,但在调试/运行时它们会被添加。


2
我认为 Visual Studio 的“位数”与此无关。VS 仍然可以生成 64 位可执行文件。我认为更相关的是,我正在从不同项目中获取组件,这些项目显然使用了不同的设置。 - Jonathan Wood

0
我也遇到过这个问题,但原因不同。在我的情况下,一个组件(表单)的构造函数或Load事件调用了另一个地方使用反射来找到所有实现特定接口的类的方法。
虽然在运行时它能正常工作,但在设计时会产生上述异常(Type Initialization异常,内部异常为Type Load异常)。

0
在凌晨3:36一小时的困惑和疲惫的排查之后,第二天用清醒的头脑很容易解决问题!我修正了控件文件名中的一个简单的拼写错误,使其与用户控件名称匹配,进行了清理和重新构建,完成得非常顺利。:]

-1
在GO项目属性中选择“生成”选项卡,检查“目标平台”是否为“AnyCPU”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接