Ответы выше в значительной степени дают вам то, что вам нужно. Вы можете попытаться загрузить все dll, которые будут подключены к вашему приложению при запуске программы:
// note: your path may differ, this one assumes plugins directory where exe is executed
var pluginsDirectory = Path.Combine(AppContext.BaseDirectory, "plugins");
if (Directory.Exists(pluginsDirectory))
{
var dllPaths = Directory.GetFiles(pluginsDirectory);
if (dllPaths.Count() > 0)
{
foreach (var dllPath in dllPaths)
{
Assembly.LoadFrom(Path.Combine("plugins", Path.GetFileName(dllPath)));
}
}
else
{
// warn about no dlls
}
}
else
{
// warn about no plugins directory
}
Как ссылаться на dll и ее типы:
// if dll file name is My.Plugin.Assembly.ShortName.dll, then reference as follows
var pluginAssembly = Assembly.Load("My.Plugin.Assembly.ShortName");
var typesInAssembly = pluginAssembly.GetExportedTypes();
var instanceType = typesInAssembly.FirstOrDefault(t => t.Name == "MyClassName");
var instance = Activator.CreateInstance(instanceType, new object[] { "constructorParam1", "constructorParam2" });
instanceType.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, instance, new object[] { "methodParam1", "methodParam2" });
Возможно, вам потребуется указать конфигурацию вашего приложения, чтобы проверить каталог плагинов. Я предполагаю, что один дочерний каталог плагинов, вы можете проверить список путей подкаталогов.
...
<runtime>
<assemblyBinding ...
<probing privatePath="plugins" />
...
Вам нужно что-то сказать, какой тип реализовать (возможно, отображение конфигурации). Интерфейс, насколько я могу судить, просто предоставит контракт, который реализуют все плагины, чтобы обеспечить ожидаемый метод для вызова через отражение.