Laden...

UserControl aus Plugin in eigener AppDomain laden

Erstellt von Garby vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.849 Views
Garby Themenstarter:in
95 Beiträge seit 2006
vor 15 Jahren
UserControl aus Plugin in eigener AppDomain laden

Hallo,

wie der Titel schon sagt, möchte ich gerne ein Plugin in eine eigene AppDomain laden,
aus diesem Plugin dann ein UserControl erzeugen, und dieses dann im Hauptprogramm einer bestehenden Windows.Form hinzufügen.

Funktioniert alles bestens bis auf das Hinzufügen.
Bei Conrols.Add kommt wird die Exception "Das Feld "parent" kann nicht in Typ "System.Windows.Forms.Control" gefunden werden." geworfen;

Aus diesem Grund habe ich es mit SetParent probiert.
Das funktioniert dann auch, allerdings mit der unschönen Nebenwirkung, dass im UserControl nicht mehr mit TAB zwischen den Controls gewechselt werden kann.

Hat jemand eine andere Idee, wie ich das UserControl einem Formular zuordnen kann, oder vielleicht einen Workaround für das unschöne SetParent-Problem?

Danke im Voraus

Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)

57 Beiträge seit 2009
vor 15 Jahren
1.665 Beiträge seit 2006
vor 15 Jahren
// Form
foreach (Control control in plugin.Controls)
{
    this.Controls.Add(control);
}

wozu hantierst du mit parent? Schreibe doch mal den betreffenden Codeschnipsel. So wird dir besser weitergeholfen werden.

Garby Themenstarter:in
95 Beiträge seit 2006
vor 15 Jahren

@Assri Komla
Was bitte soll ich jetzt aus deinem vielsagenden Post entnehmen?
Wie poste ich richtig? - welchen Punkt hab ich denn deiner Meinung nach nicht eingehalten.
Meine Frage lautet nicht "Wie kann ich meine Anwendung pluginfähig machen", sondern "Wie kann ich ein UserControl aus einem Plugin laden, das wiederum in einer eigener AppDomain geladen wird".
Dazu habe ich das Problem - wie ich finde - eindeutig beschrieben.

@JunkyXL

Funktioniert alles bestens bis auf das Hinzufügen.
Bei Conrols.Add wird die Exception "Das Feld "parent" kann nicht in Typ "System.Windows.Forms.Control" gefunden werden." geworfen

OK, vielleicht hätte ich Form.Controls.Add schreiben sollen.

Hat vielleicht jemand eine Idee?

Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)

3.971 Beiträge seit 2006
vor 15 Jahren

Was wichtig ist, dass der Thread, der das Control erstellt, der selbe ist wie der Thread der auch das Parent/Form-Control erstellt hat.

Probier weiterhin mal folgendes aus:


foreach (Control control in plugin.Controls)
{
    Control ctrl2 = Control.FromHandle(control.Handle)
    this.Controls.Add(ctrl2);
}

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

Garby Themenstarter:in
95 Beiträge seit 2006
vor 15 Jahren

Hallo kleines_eichhoernchen,

Control ctrl2 = Control.FromHandle(control.Handle)

gibt null zurück.
Werte ich contol.Handle im Debugger aus, steht folgender Wert im Überwachungsfenster:

Für die Instanz vom Typ "System.Windows.Forms.Control" können keine Felder abgerufen oder Methoden aufgerufen werden, da es sich um einen Proxy für ein Remoteobjekt handelt. Das ist eigenartig, weil SetParent ja funktioniert:

foreach (Control control in plugin.Controls)
{
    SetParent(control.Handle, this.Handle);
}

[DllImport("User32.dll")]
public static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndParent);

Naja, ich habe inzwischen das gefunden.
Auf AppDomains werde ich wohl verzichten müssen...

Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)