我正在尝试通过定义一个公共接口,然后通过反射在当前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垃圾收集。
答案 0 :(得分:0)
通过缓存程序集对象来解决问题。不知道为什么需要它。