Доброго времени суток.
У меня возникло ощущение, что в реализации System.Windows.Forms.Control+ControlCollection имеется недоработка.
Суть сабжа следующая.
Вот код метода Add:
public virtual void Add(Control value)
{
if (value != null)
{
if (value.GetTopLevel())
{
throw new ArgumentException(SR.GetString("TopLevelControlAdd"));
}
if (this.owner.CreateThreadId != value.CreateThreadId)
{
throw new ArgumentException(SR.GetString("AddDifferentThreads"));
}
Control.CheckParentingCycle(this.owner, value);
if (value.parent == this.owner)
{
value.SendToBack();
}
else
{
if (value.parent != null)
{
value.parent.Controls.Remove(value);
}
base.InnerList.Add(value);
if (value.tabIndex == -1)
{
int num = 0;
for (int i = 0; i < (this.Count - 1); i++)
{
int tabIndex = this[i].TabIndex;
if (num <= tabIndex)
{
num = tabIndex + 1;
}
}
value.tabIndex = num;
}
this.owner.SuspendLayout();
try
{
Control parent = value.parent;
try
{
value.AssignParent(this.owner);
}
finally
{
if ((parent != value.parent) && ((this.owner.state & 1) != 0))
{
value.SetParentHandle(this.owner.InternalHandle);
if (value.Visible)
{
value.CreateControl();
}
}
}
value.InitLayout();
}
finally
{
this.owner.ResumeLayout(false);
}
LayoutTransaction.DoLayout(this.owner, value, PropertyNames.Parent);
this.owner.OnControlAdded(new ControlEventArgs(value));
}
}
}
Если в качестве параметра передается контрол, созданный в отдельном AppDomain, то в выделенной строке мы получим исключение
Remoting cannot find field 'parent' on type 'System.Windows.Forms.Control'
Это происходит из-за того, что TransparentProxy не генерит заглушку для private member parent класса Control.
Тогда возникает вопрос, каким образом добавлять контролы, созданные в другом AppDomain (скажем реализуется сценарий Plugins в виде UserControl-ов).
Если семантически невозможно такое сделать — второй вопрос: Зачем наследовать Control от Component, который, в свою очередь, наследуется
от MarshalByRefObject?