保持装配通过反射加载

时间:2014-08-10 08:41:31

标签: c# clr appdomain

我正在尝试通过定义一个公共接口,然后通过反射在当前App域中动态加载程序集来为我的应用程序创建一个插件系统。以下是主要应用程序的代码:

var asm = Assembly.Load(an);
var types = asm.GetTypes();
foreach (var type in types)
{
    if (type.GetInterface(typeof(IModule).ToString()) != null)
    {
        IModule module = null;
        try
        {
            module = asm.CreateInstance(type.ToString(), true) as IModule;
        }
        catch (Exception)
        {

        }
        if (module != null)
        {
            _modules.Add(module);//These objects implement plugin interface
        }

    }
}

问题是即使我在类级别缓存插件的IModule对象,它似乎是垃圾收集。以下是演示此问题的插件代码:

internal class SamplePlugin : IModule
{
    public void Initialize() // IModule implementation
    {
        _timer = new System.Timers.Timer(1000);
        _timer.Enabled = true;
        _timer.Elapsed += TimerElapsed;
    }

    //This method never gets called
    void TimerElapsed(object sender, ElapsedEventArgs e)
    {
    }
} 

当我在缓存的IModule对象上调用initialize方法时,会成功调用initialize方法。但TimerElapsed方法永远不会被调用,这表明该对象已被CLR垃圾收集。

1 个答案:

答案 0 :(得分:0)

通过缓存程序集对象来解决问题。不知道为什么需要它。