пишу консольные приложения, которые в абстракции (не программирование) делают в общем одно и то же, на самой верхней модели, но реализация у каждого разная. есть методы: старт, стоп, вывод информации. Ну так вот, скопилось 3 приложения, в планах еще писать такие, нужно сделать главный софт, который будет запускать эти приложения и контролировать вывод информации с каждого. Погуглив, понял что приложения нужно переделывать в плагины и делать хост софт. Делаю хост софт, но получается что теперь консольные приложения, переделаные в плагины, лишаются методов Main(). Конструктор теперь нужно вызывать явно и при старте плагина выполнять метод Main()?
Плагин - понятие растяжимое. Самый православно - верный путь - dll. САМЫЙ верный путь:
1) Создаёшь либу, которая является изолированой по архитектуре и содержит лишь некий набор интерфейсов: интерфейс для предоставления контроля и интерфейс от которого наследуется главный класс плагина внутри dll которые юзают эту либу. Фактически либа - это независимый враппер для других либ.
2) Импортируешь ЯВНО (обычное подключение ссылки в визуалке) либу в проект и создаёшь класс который наследует интерфейс контроллера из либы и загружаешь динамически например из подпапки plugins все dll, см. Assembly класс и гугли "Динамическая загрузка dll C#". Но не загружаешь всю либу естественно, а лишь проходишся по каждому типу (классу) и проверяешь, наследует ли он интерфейс. Если наследует, создаёшь новый экземпляр этого типа, приводя его к типу интерфейса (ВашТипИнтерфейса plugin = экземплярТипаType.CreateInstance() или как-то так. Я не помню точно. То есть, это ЧИСТЕЙШИЙ полиморфизм). В свою очередь, в интерфейсе ты в аргумент передаёшь экземпляр того типа, который у тебя тип-контроллер и который ты реализовывал в ядре программы в виде класса контроллера. Но не новый экземпляр, ты вообще не можешь создать экземпляр типа, но уже существующий экземпляр класса который наследует интерфейс-контроллер. Это нужно чтоб ты мог реализовать обратное взаимодействие
public LoadAssemply(IController c) {
c.Log("Hello World");
}
Обычно так и делают: после создания экземпляра типа вызывают лишь единый метод загрузки библиотеки где находится логика, потоки и прочая фигня. Виртуальная машина и так и по другому всё равно загружает библиотеку.