vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

In diesem Forum haben Sie die Möglichkeit Kommentare, Fragen und Verbesserungsvorschläge zu den im vb@rchiv gelisteten Tipps und Workshops zu posten.

Hinweis:
Ein neues Thema kann immer nur über die jeweilige Tipps & Tricks bzw. Workshop Seite eröffnet werden!

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fragen zu Tipps & Tricks und Workshops im vb@rchiv
Workshop 93: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: dfense
 Workshop anzeigenDatum: 16.02.09 15:19

Funktioniert nur, solange ich keine GUI Actions mache. D.h., ich damit bin ich nicht in der Lage, im Hostprogramm eine weitere TabPage zu erstellen.

Hat da jemand Erfahrung mit?

VG
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: ModeratorRalf Ehlert (Moderator)
Datum: 17.02.09 08:24

Während meiner gestrigen Zugfahrt nach Hause von Uni habe ich mich mit deinem Problem beschäftigt

und es hat funktioniert. Zur Lösung:

Die Schnittstelle für das Plugin habe ich wie folgt definiert:

Public Interface IUIPlugin
  Property HostTab() As TabControl
  Sub AddTab()
End Interface
Grundgedanke: Der Host setzt den Plugins das Hostcontrol (hier ein TabControl), in dem sich das

Pluin integrieren "darf". Diese Integration erfolgt in der Sub, welche der Host aufruft, um das

Plugin zu initialisieren.

Hier die Implementierung der AddTab()-Methode eines einfachen Plugins:
Public Sub AddTab() Implements Contracts.IUIPlugin.AddTab
  Dim l As New Label()
  l.Text = "Hallo Host!"
 
  Dim page As New TabPage("SimplePlugin")
  page.Controls.Add(l)
 
  HostTab.TabPages.Add(page)
End Sub
Der Host sucht mittels Reflection nach den Plugins und erzeugt diese (ich habe die Plugins in einer

List(Of IUIPlugin) gespeichert) und der Aufruf ist dann auch kein Problem:
For Each plugin As IUIPlugin In plugins
  plugin.HostTab = Me.TabControl1
  plugin.AddTab()
Next
Solange du die Plugins in keine eigene AppDomain lädst, funktioniert obiger Code wunderbar.

Ralf

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: mb2k3
Datum: 10.08.09 16:09

Ich hoffe, ich kann mich hier noch anschließen.

Und zwar dreht es sich um folgendes Problem.

Ich habe eine Anwendung, die bestimmte Bibliotheken zur Laufzeit laden und entladen kann.

Nun ist es so, dass eine Bibliothek bestimmte Unterbibliotheken mit sich bringt, die benötigt werden.
Durch setzen der ApplicationBase-Eigenschaft findet die Hauptbibliothek auch die Funktionen in den Unterbibliotheken.

Solange ich mit so einem "Plugin" in der Anwendung stetig arbeite, läuft alles wunderbar.
Tue ich aber einige Minuten nichts mit der Anwendung, fängt irgendwo im Hintergrund das Framework an, der Bibliothek untergeordnete Bibliotheken aus dem Speicher zu schmeißen. ?!

Das endet damit, dass ich eine Fehlermeldung wie: "Das Objekt blablabla wurde getrennt oder ist nicht mehr auf dem Server verfügbar!" bekomme.

Meine Frage ist nun, was kann ich dagegen tun? Das setzen der Lebensdauer hat mir insofern geholfen, dass er mir nicht auch noch das Ganze Plugin aus dem speicher fegt. Wie kann ich jedoch für die Unterbibliotheken eine Lebensdauer festlegen?

Vielen Dank!
Matthias Bergen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: deBloi
Datum: 14.01.10 16:03

Ich habe ein ähnliches Problem wie mein Vorgänger... ein eigentlich funzendes Pluginsystem, welches meine PlugIns erfolgreich läd und bei bedarf auch entläd.

Jedoch wird die Verbindung zu den Bibliotheken wenn sie eine bestimmte Zeit lang (ca. 2min) nicht gefordert werden vom netframework getrennt.
Um die Lebensdauer der Bibliothek auf unendlich zu setzen, überschreibe ich auch wie in unzähligen Beiträgen beschrieben die InitializeLifeTimeService auf Nothing.
Leider scheint diese Prozedur wirkungslos zu sein...

Was mach ich falsch?
Danke im Vorraus....

Hier etwas Code vom PlugIn
<Serializable()> Public Class clsPlugin 'Make it creatable on Runtime
    Inherits MarshalByRefObject 'AppDomain Compatibility
    Implements clsPluginLoader.clsPluginLoader.IPlugin 
'Link this class to the plugin interface IPlugin
    Dim myHost As clsPluginLoader.clsPluginLoader.IHost
 
Public Overrides Function InitializeLifeTimeService() As Object 
'Make the plugin-lifetime unlimited (otherwise it will expire)
        Return Nothing
    End Function
 
 
    Public Sub SetHost(ByVal mHost As clsPluginLoader.clsPluginLoader.IHost) _
      Implements clsPluginLoader.clsPluginLoader.IPlugin.SetHost
        myHost = mHost 'Set a link to objects of the main-application
    End Sub
 
    Public Function GetName() As String Implements _
      clsPluginLoader.clsPluginLoader.IPlugin.GetName 'Get the plugin name
        Return "Aktueller Tag"
    End Function
 
    Public Function GetString(ByVal myZahlungsart As String) As String _
      Implements clsPluginLoader.clsPluginLoader.IPlugin.GetString 'Get the 
    ' plugin name
        Dim myDate As DateTime
        myDate = System.DateTime.Today
        Dim startDate As DateTime
        Dim endDate As DateTime
        startDate = System.DateTime.Today & " 00:00:00"
        endDate = System.DateTime.Today & " 23:59:59"
 
        Dim mySQLString As String = ""
        Select Case myZahlungsart
            Case Is = "Soll"
                mySQLString = "AND (KDI.DebitorSoll_Buchungsdatum >= '" & _
                  startDate & "')" _
                & " AND (KDI.DebitorSoll_Buchungsdatum <= '" & endDate & "')"
            Case Is = "IST"
                mySQLString = " AND (KDI.DebitorIST_Buchungsdatum >= '" & _
                  startDate & "')" _
                 & " AND (KDI.DebitorIST_Buchungsdatum <= '" & endDate & "')"
        End Select
 
        Return mySQLString
    End Function
 
    Public Sub Load() Implements clsPluginLoader.clsPluginLoader.IPlugin.Load 
'When the plugin is loaded
        'System.Windows.Forms.MessageBox.Show("Plugin is loaded 4Plugin")
    End Sub
 
    Public Sub Unload() Implements _
      clsPluginLoader.clsPluginLoader.IPlugin.Unload 
'When the plugin is unloaded
        'System.Windows.Forms.MessageBox.Show("Plugin is unloaded 4Plugin")
    End Sub
 
    Public Sub Run() Implements clsPluginLoader.clsPluginLoader.IPlugin.Run
        myHost.myLabel.Text = "Aktueller Tag"
    End Sub
 
End Class
Hier der PlugInLoader:
Public Class clsPluginLoader
 
    Public Interface IPlugin
        Function GetName() As String
        Function GetString(ByVal myZahlungsart As String) As String
        Sub Load()
        Sub Unload()
        Sub Run()
        Sub SetHost(ByVal mHost As IHost)
    End Interface
 
    Public Interface IHost
        Function myLabel() As System.Windows.Forms.Label
    End Interface
 
End Class
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: dfense
Datum: 14.01.10 18:37

InitializeLifeTimeService=Nothing? So ein quatsch. Schau dir bitte die Schnittstellen ILease/ISponsor an. Damit kannst du beim "Lebensablauf" deines MarshalByRef-Objektes die Lebensdauer verlängern. Z.B. immer wieder auf 30 Min. Das ist genau das was du suchst. Und im übrigen wird nichts getrennt, sondern aufgeräumt . Das scheinen viele nicht zu beachten, wenn es um Remoting geht. Muss man aber auch erstmal drauf kommen... ;-P

VG,
dfense
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: deBloi
Datum: 14.01.10 19:17

Danke für Deine Antwort...
Hm, habe bis jetzt angenommen, dass bei

Public Overrides Function InitializeLifeTimeService() As Object 
'Make the plugin-lifetime unlimited (otherwise it will expire)
        Return Nothing
    End Function
die Lebenszeit des Objektes auf unendlich gesetzt wird.

Ich werde mir bei nächster Gelegenheit die MarshalByRef Objects anschauen und hoffe ich werde daraus schlauer.

Falls nicht melde ich mich noch einmal auf diesem Kanal...
Danke erst mal...
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Erstellen von Plugins zum Erweitern eigener Programme 
Autor: Jan5366
Datum: 01.07.14 02:07

Hallo,

leider bekomme ich das mit dem ILease/ISponsor noch nicht wirklich zum Laufen.
Die Englischen Tutorial die ich in Google gefunden habe haben mir auch nicht wirklich weitergeholfen.
Da ich keine Richtigen Code Beispiele gefunden habe :-/

Würde mich sehr um Hilfe freuen !



PS: Ja ich weiß das der letzte Post ~ 4 Jahre alt ist, Sry ^^

Destiny of the Galaxy:
http://www.cendesia.de
http://www.facebook.com/Cendesia
- Weltraum RPG mit Vb.Net und DirectX9
- jetzt kostenlos die Pre-Alpha testen

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um einen neuen Beitrag schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel