动态加载.NET程序集

时间:2009-05-25 07:49:00

标签: c# .net vb.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)

除了一个我无法弄清楚的问题之外,每件事都有效,我能够访问我的暴露属性。在我的插件中,我使用以下代码来公开属性:

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。那我在这里错过了什么?我相信这很明显。提前致谢

1 个答案:

答案 0 :(得分:3)

首先,看看MEF,因为你没有明显的理由重新发明轮子。

至于您的原始问题,请确保您的插件实例未被处理或PanelObject已分配Nothing或类似的东西:.NET垃圾收集器与此问题无关。