我正在编写程序,我希望该程序支持插件。我创建了一个程序必须实现的接口。我使用我的主程序中的以下代码来调用插件:
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)
除了一个我无法弄清楚的问题之外,每件事都有效,我能够访问我的暴露属性。在我的插件中,我使用以下代码来公开属性:
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
好的,所以我从我的主程序中设置了这个属性,一切正常。除了,一段时间后,由于某些奇怪的原因,m_PanelObject被设置为Nothing。我没有在程序中的任何地方设置它,并且插件代码中没有任何地方将其设置为Nothing。那我在这里错过了什么?我相信这很明显。提前致谢
答案 0 :(得分:3)
首先,看看MEF,因为你没有明显的理由重新发明轮子。
至于您的原始问题,请确保您的插件实例未被处理或PanelObject
已分配Nothing
或类似的东西:.NET垃圾收集器与此问题无关。