C# 获取组件';Compact框架中的父容器

C# 获取组件';Compact框架中的父容器,c#,.net,compact-framework,system.componentmodel,C#,.net,Compact Framework,System.componentmodel,我基本上需要做与中相同的事情: 然而,在紧凑框架中没有定义 IDesignerHost 你知道怎么做吗 编辑: 我想把它放到一些System.Windows.Forms.Container控件上的是System.ComponentModel.Component派生组件。 我需要引用它的原因是,我不想在我将组件放置到的每个表单中手动设置组件的父容器。在紧凑框架中,表单的组件包含在成员容器变量中。除了表单创建实例这一事实之外,该容器和表单本身之间没有直接关系。因此,该实例可以很容易地传递给其他一

我基本上需要做与中相同的事情:

然而,在紧凑框架中没有定义

IDesignerHost
你知道怎么做吗

编辑: 我想把它放到一些
System.Windows.Forms.Container
控件上的是
System.ComponentModel.Component
派生组件。
我需要引用它的原因是,我不想在我将组件放置到的每个表单中手动设置组件的父容器。

在紧凑框架中,表单的组件包含在成员容器变量中。除了表单创建实例这一事实之外,该容器和表单本身之间没有直接关系。因此,该实例可以很容易地传递给其他一些表单或非表单类,并且原始父类被释放

这意味着无法确定组件的“包含形式”。这些信息根本不存储在任何地方(GC可以看到根,但这有点不同,无论如何都不可查询)

现在,如果您只希望引用IContainer,而不希望引用保存IContainer实例的表单,那么您可以查询
component.Site.Container
,但即使这样,其中也存在大量潜在的漏洞

例如,如果将SerialPort组件放到表单上,设计器会将其添加到components集合中,并设置
SerialPort.Site.Container
。但是,如果将计时器组件放到表单上,计时器不会添加到组件集合中,因此
Timer.Site
实际上是
null
,因此即使尝试查询容器也会抛出NullReferenceException

为了让它更有趣,像SerialPort这样的组件还具有允许在没有IContainer的情况下创建的构造函数,因此,当在设计器中将SerialPort放到窗体上时,会将其添加到窗体的组件中,如果开发人员手动创建SerialPort,则很少会将其添加到Components集合中


基本上,我认为您需要重新考虑您的预期架构。您必须想出一些不依赖于父容器的机制。

您创建了什么类型的组件?如果不是什么类型?您尝试了什么,为什么需要这样做?请参阅我的编辑。我尝试了来自的解决方案,但正如我前面所述,在Compact FrameworkFair上没有
IDesignerHost
实现。谢谢你的解释