2009-05-25 5 views
0

Je vous écris un programme et je veux le programme pour soutenir les plugins. J'ai créé une interface que le programme doit implémenter. Je suis en utilisant le code suivant de mon programme principal pour appeler le plugin:Dynamiquement chargement des assemblages .NET

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) 

Tout fonctionne et je suis en mesure d'accéder à mes propriétés exposées, sauf pour un problème que je ne peux pas comprendre. Dans mon plug-in, j'utilise le code suivant pour exposer une propriété:

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, donc je mets cette propriété de mon programme principal et tout fonctionne. Sauf, après un certain temps, m_PanelObject est mis à Nothing pour une raison étrange. Je ne le mets à Nothing nulle part dans mon programme et il n'y a pas de place dans le code du plugin qui le définit à Nothing. Alors qu'est-ce qui me manque ici? Je suis sûr que ce sera assez évident. Merci d'avance

+0

Pouvez-vous fournir un échantillon de votre programme principal, en particulier lorsque la ligne où l'exception est levée? – Galilyou

+0

La ligne suivante est appelée à partir du programme principal: Plugin.Plugin.DataWriteHeader (FileWriter, "TestTable") Ceci est un sous dans le plugin. Le plugin lui-même est l'endroit où l'exception est lancée. –

Répondre

3

D'abord, jetez un oeil à MEF parce que vous réinventez une roue sans raison apparente.

Quant à votre question initiale, assurez-vous que votre instance plugin ne soit pas disposé à ou PanelObject est attribué Nothing ou quelque chose du genre: .NET Garbage Collector n'a rien à voir avec ce problème.

+0

La raison pour laquelle je n'utilise pas MEF est parce que, si je comprends bien, il est ciblé pour .NET 3.5 ou .NET 4.0. Mon application cible .NET 2.0 –

+0

Non, MEF peut également être utilisé avec .NET 2.0. –

+0

Je vais vérifier alors. Merci pour la contribution. –

Questions connexes