. . assemlby, , , - assemlby.GetExportedTypes() Activator.CreateInstance() ( , ), )
:
var workerTypes = assembly.GetExportedTypes()
.Where(t => t.IsClass && !t.IsAbstract && typeof(IWorker).IsAssignableFrom(t));
foreach (var type in workerTypes)
{
var worker = (IWorker)Activator.CreateInstance(type);
worker.CheckAndCreateWork("Work");
}
assemlby - . Assemlby.LoadFrom() - :
var assembly = typeof(SomeClassInTargetAssembly).Assembly;
*. DLL (, ./plugins), :
foreach (var file in Directory.GetFiles(PluginsFolder, "*.dll"))
{
var assembly = Assembly.LoadFrom(file);
var workerTypes = GetWorkerTypes(assembly);
RunWorkers(workerTypes);
}
You may want to separate the processes of loading and starting workers to avoid loading work types several times (in case you need to run employees more than once during the life of the application)
source
share