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)
// 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.
> Codejunky <
@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)
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...
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)