2009-05-25 8 views
0

Ich schreibe ein Programm und möchte, dass das Programm Plugins unterstützt. Ich habe eine Schnittstelle erstellt, die das Programm implementieren muss. Ich verwende den folgenden Code aus meinem Hauptprogramm das Plugin zu nennen:Dynamisch geladene .NET Assemblies

Dim asm As Assembly = Assembly.LoadFrom(ff.FullName) 
' Get the type 
Dim myType As System.Type = asm.GetType(asm.GetName.Name + "." + asm.GetName.Name) 
' If the type is null then we try again without the root namespace name 
If myType Is Nothing Then myType = asm.GetType(asm.GetName.Name) 
' Check to see if the plugin implements the required Interface 
Dim IsMyPlugin As Boolean = GetType(LGInterfaces.ILGSQLPlugin).IsAssignableFrom(myType) 
Dim ActivePlugin As New PluginObject() 
If IsMyPlugin Then 
    ActivePlugin.Plugin = CType(Activator.CreateInstance(myType), LGInterfaces.ILGPlugin) 

Jedes Ding funktioniert und ich bin in der Lage meine ausgesetzten Eigenschaften zuzugreifen, außer für ein Problem kann ich nicht herausfinden. In meiner Plugin verwende ich den folgenden Code ein Objekt zu belichten:

Private m_PanelObject As Windows.Forms.Control 

Public Property PanelObject() As Windows.Forms.Control 
Get 
    Return m_PanelObject 
End Get 
Set(ByVal value As Windows.Forms.Control) 
    m_PanelObject = value 
End Set 

Ok, so dass ich diese Eigenschaft von meinem Hauptprogramm und alles funktioniert. Außer, nach einiger Zeit wird m_PanelObject aus irgendeinem Grund auf Nothing gesetzt. Ich setze es nirgendwo in meinem Programm auf "Nothing" und es gibt keinen Platz im Plugin-Code, der es auf Nothing setzt. Also was fehlt mir hier? Ich bin mir sicher, dass das ziemlich offensichtlich sein wird. Vielen Dank im Voraus

+0

Können Sie ein Beispiel aus Ihrem Hauptprogramm angeben, insbesondere wo die Zeile, in der die Ausnahme ausgelöst wird? – Galilyou

+0

Die folgende Zeile wird aus dem Hauptprogramm aufgerufen: Plugin.Plugin.DataWriteHeader (FileWriter, "TestTable") Dies ist ein Sub im Plugin. Das Plugin selbst ist der Ort, an dem die Ausnahme ausgelöst wird. –

Antwort

3

Betrachten Sie zuerst MEF, weil Sie ein Rad aus ersichtlichen Gründen neu erfinden.

Wie für Ihre ursprüngliche Frage, stellen Sie sicher, dass Ihre Plugin-Instanz nicht entsorgt wird oder PanelObjectNothing oder etwas der Art zugeordnet ist: .NET Garbage Collector hat nichts mit diesem Problem zu tun.

+0

Der Grund, warum ich MEF nicht verwende, liegt darin, dass es, wie ich es verstehe, auf .NET 3.5 oder .NET 4.0 abzielt. Meine Anwendung zielt auf .NET 2.0 –

+0

Nein, MEF kann auch mit .NET 2.0 verwendet werden. –

+0

Ich werde es dann überprüfen. Danke für die Eingabe. –

Verwandte Themen