Momenteel ben ik bezig met een applicatie met een server deel en een client deel.
Omdat het in de toekomst uitgebreidt gaat worden met diverse onderdelen heb ik een plugin model bedacht icm remoting.
De applicatie kent een aantal vaste onderdelen waarin variaties zitten (bv taken: er zijn diverse soorten taken). Ik heb voor deze onderdelen interfaces (IJob) gemaakt die via remoting over en weer naar de server/client gestuurd worden.
So far so good.
Omdat ik de uitbreiding van de applicatie makkelijk wil houden zonder dat er op elke client zaken geinstalleerd moeten (buiten de basis applicatie en de interfaces), heb ik diverse plugins gemaakt welke op de server draaien. De meeste van deze plugins hebben echter ook instellingen en ik wilde deze via een form in de plugin op de server "publiceren" aan de clients... Maar forms en controls zijn niet te serializeren. Hierdoor kunnen ze niet op de clients draaien.
Op internet heb ik op diverse plekken gevonden hoe je alsnog een control kunt (de)serializen zodat ze alsnog via remoting werken. Dit heb ik toegepast (zie code voor een textbox) en dit gaat ook goed.
Om het eenvoudiger te remoten wil ik binnen elke plugin een form maken met hierop een panel waarin de uiteindelijke controls zitten. Ook dit panel heb ik serializable gemaakt.
Wanneer ik dit panel nu via remoting aanroep kan ik netjes ophalen hoeveel controls het bevat en door de control collectie lopen (de control collection is niet serializable, maar dit heb ik opgelost door een Arraylist als property te maken welke alle controls bevat (via add).
Wanneer ik nu echter deze controls of panel probeer toe te voegen als control aan een panel welke zich in een form in de client bevindt krijg ik onderstaande foutmelding.
Er zitten echter geen privates oid in.
Op internet kan ik hier geen oplossing voor vinden. Is dit gewoon niet mogelijk (eventueel via een work-around) of zie ik iets over het hoofd?
Ik heb ook al geprobeerd om de controls opnieuw aan te maken in de client (dus nieuw control maken en deze toevoegen aan controlcollection), zodat het lijkt alsof deze vanuit de server komt. Echter zit je dan met events etc. Dit heeft dus niet mijn voorkeur.
Of zijn er andere manieren om de controls in de plugin te laten zitten, via de client te kunnen instellen, maar deze plugins niet op de client te hoeven installeren.
Thanx
Omdat het in de toekomst uitgebreidt gaat worden met diverse onderdelen heb ik een plugin model bedacht icm remoting.
De applicatie kent een aantal vaste onderdelen waarin variaties zitten (bv taken: er zijn diverse soorten taken). Ik heb voor deze onderdelen interfaces (IJob) gemaakt die via remoting over en weer naar de server/client gestuurd worden.
So far so good.
Omdat ik de uitbreiding van de applicatie makkelijk wil houden zonder dat er op elke client zaken geinstalleerd moeten (buiten de basis applicatie en de interfaces), heb ik diverse plugins gemaakt welke op de server draaien. De meeste van deze plugins hebben echter ook instellingen en ik wilde deze via een form in de plugin op de server "publiceren" aan de clients... Maar forms en controls zijn niet te serializeren. Hierdoor kunnen ze niet op de clients draaien.
Op internet heb ik op diverse plekken gevonden hoe je alsnog een control kunt (de)serializen zodat ze alsnog via remoting werken. Dit heb ik toegepast (zie code voor een textbox) en dit gaat ook goed.
Om het eenvoudiger te remoten wil ik binnen elke plugin een form maken met hierop een panel waarin de uiteindelijke controls zitten. Ook dit panel heb ik serializable gemaakt.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| Imports System.Runtime.Serialization Namespace Interfaces.Plugin.Controls <System.Serializable()> _ Public Class Textbox Inherits System.Windows.Forms.TextBox Implements System.Runtime.Serialization.ISerializable Public Sub New() Me.Location = New Drawing.Point(10, 10) Me.Width = 100 Me.Height = 24 Me.Text = "Textbox1" Me.Name = "Textbox1" End Sub Public Sub New(ByVal info As SerializationInfo, ByVal context As _ StreamingContext) Me.Location = New Drawing.Point(info.GetInt32("x"), info.GetInt32("y")) Me.Width = info.GetInt32("width") Me.Height = info.GetInt32("height") Me.Text = info.GetString("text") Me.Name = info.GetString("name") End Sub Public Sub GetObjectData(ByVal info As SerializationInfo, ByVal context As _ StreamingContext) Implements ISerializable.GetObjectData With info .AddValue("x", Me.Location.X) .AddValue("y", Me.Location.Y) .AddValue("width", Me.Width) .AddValue("height", Me.Height) .AddValue("text", Me.Text) .AddValue("name", Me.Name) End With End Sub End Class End Namespace |
Wanneer ik dit panel nu via remoting aanroep kan ik netjes ophalen hoeveel controls het bevat en door de control collectie lopen (de control collection is niet serializable, maar dit heb ik opgelost door een Arraylist als property te maken welke alle controls bevat (via add).
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
| Public ReadOnly Property PanelControls() As ArrayList Get Dim arrControls As New ArrayList Dim objControl As System.Windows.Forms.Control For Each objControl In Me.Controls arrControls.Add(objControl) Next Return arrControls End Get End Property |
Wanneer ik nu echter deze controls of panel probeer toe te voegen als control aan een panel welke zich in een form in de client bevindt krijg ik onderstaande foutmelding.
Er zitten echter geen privates oid in.
code:
1
2
3
| Op de regel: objPanel.Controls.Add(objControl) Permission denied: cannot call non-public or static methods remotely. |
Op internet kan ik hier geen oplossing voor vinden. Is dit gewoon niet mogelijk (eventueel via een work-around) of zie ik iets over het hoofd?
Ik heb ook al geprobeerd om de controls opnieuw aan te maken in de client (dus nieuw control maken en deze toevoegen aan controlcollection), zodat het lijkt alsof deze vanuit de server komt. Echter zit je dan met events etc. Dit heeft dus niet mijn voorkeur.
Of zijn er andere manieren om de controls in de plugin te laten zitten, via de client te kunnen instellen, maar deze plugins niet op de client te hoeven installeren.
Thanx