Size: a a a

DotNetRuChat🍂

2016 July 31

МП

Миша Проказин in DotNetRuChat🍂
??
источник

NK

ID:221868624 in DotNetRuChat🍂
Аккаунт Переехал На @kekekeks
Только нужен гитхаб акк
можно юзать группы, т.е. можно же сделать оргу для конфы
источник

NK

ID:221868624 in DotNetRuChat🍂
збс же идейка
источник

ДС

Дмитрий Скрыльников in DotNetRuChat🍂
ID:221868624
но из-за того что школьник одинок во всей вселенной
И чем тебе помочь ?
источник

NK

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

AY

Alexey Yakimov in DotNetRuChat🍂
ID:221868624
но из-за того что школьник одинок во всей вселенной
ты н еодинок) видишь целый чатик в телеграмме )
источник

ВС

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

NK

ID:221868624 in DotNetRuChat🍂
Ах да если у нас сверху public LoadAssembly(IController c) то в интерфейсе IPlugin (например) должен быть соответствющий метод согласно наследованию.
источник

NK

ID:221868624 in DotNetRuChat🍂
Параметр в хост? То есть обратное взаимодействие?
источник

ВС

Василий Старовойтов in DotNetRuChat🍂
Да
источник

ВС

Василий Старовойтов in DotNetRuChat🍂
Статистику брать например или счет передать
источник

NK

ID:183231530 in DotNetRuChat🍂
ID:221868624
но из-за того что школьник одинок во всей вселенной
был школьником до сегодняшнего утра. Получил справку о том, что я зачислен. Теперь буду троллить школьников.
источник

ДС

Дмитрий Скрыльников in DotNetRuChat🍂
Красава
источник

ДС

Дмитрий Скрыльников in DotNetRuChat🍂
А я вот уже год учусь в универе
источник

NK

ID:183231530 in DotNetRuChat🍂
Дмитрий Скрыльников
А я вот уже год учусь в универе
хмм
источник

NK

ID:221868624 in DotNetRuChat🍂
Как я говорил, ты создаёшь в dll плагин-провайдере ещё один интерфейс в котором пишешь тонну методов вроде SetStatistics() и наследуешь его в основной программе. Потом перед тем как загружать плагины (например, при загрузке программы) создаёшь экземпляр из класса который наследовал этот интерфейс и когда загружаешь плагины и выполняешь методы из них, передаёшь переменную типа IController (или как ты назвёшь свой интерфейс-контроллер)
источник

NK

ID:221868624 in DotNetRuChat🍂
Тогда внутри плагина ты можешь получить доступ ко всем методам прописанным в IController и они будут работать с программой
источник

ВС

Василий Старовойтов in DotNetRuChat🍂
Не, я не про то. Я про события
источник

NK

ID:221868624 in DotNetRuChat🍂
Аааа вот тут фишка я тебе сейчас парадокс раскажу
источник

NK

ID:221868624 in DotNetRuChat🍂
Я это недавно нашёл
источник