Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[.NET] Remoting form/control

Pagina: 1
Acties:

  • DukeMan
  • Registratie: Mei 2000
  • Niet online
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.

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

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Als ik het goed begrijp wil je vanaf de client een bepaale plugin kunnen gebruiken die niet op de client is geinstalleerd maar op de server? En deze plugin kent ook een aantal setting die tevens op de server toegepast/opgeslagen moeten worden?

Ik heb niet veel met zowel remoting als plugins en gewerkt maar volgens mij is het niet de bedoeling om Forms via remoting te gebruiken.

Wanneer de client/server opstelling binnen een LAN werkt zou je de plugin-libraries op een share kunnen zetten (de plugins bevatten dan alle nodige klassen incl Forms en controls). Zo kan de client-applicatie in die share zoeken naar plugins en deze laden. Als je de plugin's dan zo maakt dat deze de settings via ophalen/wegschrijven ben je een heel eind denk ik.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:11
Wat wil je eigenlijk ?
Je wil gewoon een aantal eigenschappen van je remote component op de client (die toevallig een windows forms app kan zijn) laten zien ?
Indien ja: dan ben je niet goed bezig. Je remote component is nu aan je UI gekoppeld. Is het niet beter om een method te maken op je remote component die je vanuit je client kan aanroepen, en die je de nodige properties returned die je wilt gaan tonen ?

Je kan ook events definieren in je remote component, zodanig dat je client daar kan op subscriben.

(Zorg er wel voor dat je geen 'chatty interface' hebt, maar eerder een chunky. Dwz, beter meer gegevens in één keer overhalen, dan meerdere remote calls te moeten doen).

https://fgheysels.github.io/


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Beetje late reactie, maar wat ik wil is het volgende:

De applicatie kent plugins, bijvoorbeeld (zie TS) een Job plugin. Er zijn verschillende taken die gedaan kunnen worden: bv iets kopieren, downloaden etc. Elke taak is een aparte plugin.

Elke plugin heeft zijn eigen eigenschappen: toevallig bij bovenstaande is het bij allebei waar komt het vandaan en waar moet het naartoe, maar de mogelijkheden zijn eindeloos (bv critiria wanneer iets gekopieerd/gedownload moet worden).

Omdat ik de objecten en logica niet naar de clients wil brengen wil ik de clients/plugins via de server laten werken via remoting.
Data ophalen uit de database, deze verwerken en versturen naar de clients etc gaat allemaal goed, alleen moet een client kunnen instellen wat zo'n job moet doen en dus kunnen opgegeven (bv) welke bestanden gedownload/gekopieerd moeten worden.
Dit wil ik via een UI doen, maar om te voorkomen dat elke plugin dus ook lokaal geinstalleerd moet worden wilde ik die UI op de server laten bestaan en via Remoting naar de client halen.


Ik heb het nu inmiddels anders opgelost.
Elke plugin kan een extra DLL hebben waarin de UI's zitten. Wordt een plugin aangeroepen en moet de UI naar voren komen, wordt via remoting gecontroleerd of er een UIPlugin is. Is dit het geval wordt deze gekopieerd naar de client en wordt vandaaruit de UI getoond. Deze geeft (als object) de ingestelde properties terug welke weer naar de server worden gestuurd.

Via een omweg allemaal, maar het werkt wel.