FarNet — плагин для написания плагинов на .NET языках

Здесь можно обсудить ваш любимый плагин.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Latest post of the previous page:

Mors
Готово. По иронии судьбы у меня самого сейчас х64 машина временно недоступна, так что первую сборку с х64 версией выкладываю, не прогнав тесты. Но по идее тестировал незадолго до этого, не должно быть особых проблем, надеюсь.

На всякий случай добавлю (по-русски). Поставка включает в себя и х86 версию, и х64. Отличается только один файл - FarNetMan.dll. Для х86 он находится, где обычно, а для х64 в \Plugins.x64\FarNet, но копировать его нужно туда же, куда обычно, то есть в %FARHOME%\Plugins\FarNet.
lam0x86
Posts: 14
Joined: Wed 11 Mar, 2009 15:24

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by lam0x86 »

Маленькая архитектурная хотелка:
Сейчас у класса BasePlugin есть свойство Far, у которого оба аксессора имеют модификатор public. Было бы логичнее аксессор get сделать protected, а set - internal, а у сборки FarNetIntf прописать атрибут типа этого:

Code: Select all

[assembly:InternalsVisibleTo("FarNetPlugin, PublicKey=...")]
Зачем это нужно, думаю, понятно.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

lam0x86
Зачем это нужно, думаю, понятно.
Нет. Ну то есть, может, и понятно, но я не уверен, что так же, как и тебе. Объясни, пожалуйста, подробнее. И про атрибут тоже, я такой первый раз вижу. Твоя хотелка - тебе меня и учить :). Сделаю, если убедишь.

FarNetIntf ты упомянул. Ты еще на первом Фаре, да (для второго сборка называется FarNet)? Тот Фарнет развиваться больше не будет (мной, во всяком случае). Там только серьезные проблемы могу пофиксить, а эта хотелка - не проблема. Предложение могу внести только в FarNet 4.x, то есть для Фар 2.
lam0x86
Posts: 14
Joined: Wed 11 Mar, 2009 15:24

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by lam0x86 »

Ага, сижу на первом пока)
Во втором были некоторые проблемы со старыми плагинами, поэтому пока не переходил. Но скоро придётся пересилить себя =)
А атрибут InternalsVisibleTo - это такой хак от майкрософта, который используется компилятором и самой CLR во время исполнения программы и обеспечивает возможность видеть internal-сущности из внешних сборок.
В BasePlugin свойство Far должно устанавливаться только классом, который хостит плагин. Никто не должен иметь возможность подставить туда свою имплементацию IFar или вообще обнулить это свойство. В принципе, вряд ли кто-то будет так делать, но чтобы отсечь даже теоретическую возможность такого грязного хака я бы сделал сеттер internal-ом.
А что касается getter-а — тут дело вкуса, но я бы сделал его protected, т.к. только плагин в праве решать как он должен взаимодействовать со средой. И если какой-нибудь плагин второго уровня получит ссылку на BasePlugin, то у него не будет возможности вызвать, скажем, метод IFar.Msg напрямую, потому что у него не будет ссылки на IFar. Вместо этого ему придётся эскалировать запрос через BasePlugin, если такая возможность имеется. Таким образом достигается лучшая управляемость подплагинами. С другой стороны, сделать protected getter может быть сложно из-за необходимости поддержания backward compatibility...
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Насчет сеттера идея мне нравится, я думал ее пару минут пару лет назад, но аттрибута такого не знал. Хак, не хак, атрибут официальный, документированный - я его использую, хорошо.

Про геттер наверное не соглашусь. Мудрено, а выгоды неубедительны на фоне некоторых очевидных неудобств. И ты прав, breaking change, это. У меня в первую очередь в PowerShellFar все отвалится (переделать дело 2-х минут, но..). Там несколько десятков классов нормально доступаются до Фара именно через публичное свойство Far плагина. И все ок. Я соглашусь, что идеологически это не абсолютно чистый дизайн. Но практика показывает, что это просто удобно. Кроме того, пользователь, который понимает почему это не чистый дизайн для геттера - достаточно грамотен и для того, чтобы не юзать это свойство, где не надо. А пользователь, который не понимает - не поймет и почему "от него это свойство закрыли".

Про сеттер договорились. Про геттер пока буду просто думать в фоновом режиме.
lam0x86
Posts: 14
Joined: Wed 11 Mar, 2009 15:24

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by lam0x86 »

Ну и отличненько =)
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Есть конечно одна крези возможность прямо сейчас, а если свойство защитить, то теоретически она отсекается. Сборка FarNetMan.dll подключает всю кухню к Фару. А можно (теоретически) подключить к чему-то другому, имплементируя FarNet интерфейсы, скажем, для Тотала или Вижуал Студии, ну или на что фантазии хватит. И тогда, теоретически и с оговорками, но все плагины, что написаны для Фара, тут же заработают под Тоталом и т.п. А по твоей схеме с сеттером будет проблема, мы ж не знаем наперед все сборки, которые захотят заменить FarNetMan.

Но практически пока это все для Фара только. А если когда будет и не только уже на практике, то можно и переделать, экая беда.
lam0x86
Posts: 14
Joined: Wed 11 Mar, 2009 15:24

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by lam0x86 »

Так это ж даже лучше — кроме тебя хрен кто использует твой плагин без спроса! :D
Авторам придётся связываться с тобой чтобы ты добавил сборку в фрэнд-лист... :ha:
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Ну ты жмот :) А мне не жалко. Кроме того, я ж сказал, что все это "теоретически". А когда до практики дойдет, то выяснится, что хотелось-не-хотелось, но FarNet интерфейсы заточены под Фар, а могли бы быть более нейтральными к таргет хосту. И тогда уж скорей попросят сделать интерфейсы более абстрактными, чем какой-то атрибутик добавить, что можно и самим без проблем при наличии сорсов.

Но на самом деле по уму и хорошему дизайну надо бы это не свойством делать, а передавать IFar параметром в метод Connect(). Это решает *абсолютно* все проблемы, что были перечислены. Но через свойство сделано по двум причинам: 1) исторически (и я не первоначальный автор, а скорей, третий); 2) чтоб максимально упростить жизнь мини плагинам из пары сточек кода.
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

что-то не склеивается

Code: Select all

[assembly: InternalsVisibleToAttribute("FarNetMan, PublicKeyToken=null")]
...
		public IFar Far
		{
			get { return _Far; }
			internal set { _Far = value; }
		}
и в итоге все равно при компиляции св-во недоступно. что я делаю не так? может надо обязательно подписанным иметь дружественную сборку? тогда я пас, зачем еще этот геморрой?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Вобщем, вроде разобрался. Там для С++ еще вот какое надо использовать в самом коде:
#using "FarNet.dll" as_friend

И еще там заморочки с тем, чтобы компилятор этот файл еще нашел и чтобы он не конфликтовал с уже существующей зависимостью, которая без friend указана. Мне это разонравилось... Оставлю все как было до тех пор пока не будет лучшего решения.. Но за предложение спасибо все равно, оно по сути своей, конечно, неплохое.

А вообще раз мы такие проблемы обсуждаем, значит, не так все плохо с плагином :)
GMax
Posts: 165
Joined: Wed 10 Aug, 2005 09:20
Has thanked: 1 time

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by GMax »

у меня вопросик такой: а multilanguage плагины писать самому или к lng интерфейс какой есть ?
User avatar
NightRoman
Posts: 6184
Joined: Fri 18 Aug, 2006 13:52
Location: Cambridge, UK
Has thanked: 32 times
Been thanked: 62 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by NightRoman »

Хороший вопрос. В Фаре нет прямого механизма для поддержки локализации плагинов второго уровня, которыми Фарнет плагины и являются. Вроде есть какие-то обходные пути, но я их не знаю, если честно. Если бы был прямой механизм, я бы уже его задействовал. А поскольку механизм не прямой, то тут возникает вопрос, а не проще ли его именно самому .нет плагину и решить штатными .нет средствами - через ресурсы, например. Может, какая-то поддержка от Фарнета все равно потребуется – объясняйте, сделаю (возможно, с оговорками).

Небольшая проблема в том, что «мне это не надо». Это не значит, что я этого делать не хочу или не буду. Хочу и буду, потому что это «в принципе надо». Но раз мне не было надо, то я в этом не разбираюсь и не уверен, как оно лучше должно быть реализовано, чтобы оно было удобно практически для тех, кто использует, а не теоретически для тех, кто только проектирует. Грубо говоря, по конкретно этому вопросу мне нужно техническое задание, более или менее грамотно сформулированное и продуманное с учетом имеющихся средств, включая штатные .нет механизмы локализации, например, в которых я опять же не разбираюсь, и значит кто-то другой в качестве эксперта должен выступить.

До опыта мне кажется, что курить надо все же в сторону родных .нет инструментов локализации (могу заблуждаться). Пусть кто-то это попробует сначала ручками в своем плагине и выяснит, как оно вообще работает, и какая часть этой работы будет предположительно общей для других плагинов тоже, и значит может быть абстрагирована и вынесена в общее ядро, в Фарнет. После этого приходите с предложениями, ТЗ, бишь.

Честно, я не отпинываюсь от этого, наоборот, приветствую, сделать это просто надо, рано или поздно. Но один я в это дело не полезу, пока мне не надо, а не надо будет долго – ни у меня, ни у кого из моих коллег и «близких» пользователей с английским нет проблем, и даже изначально не-англоязычные предпочитают обычно английский интерфейс и документацию, ибо они «более узнаваемые и предсказуемые». Опять же мои плагины FarNet и PowerShellFar по природе своей предназначены для девелоперов, а у них с ангельским тоже обычно нет особых проблем, во всяком случае, «на чтение и восприятие UI».
User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by Skirda »

NightRoman wrote:В Фаре нет прямого механизма для поддержки локализации плагинов второго уровня, которыми Фарнет плагины и являются. Вроде есть какие-то обходные пути, но я их не знаю, если честно. Если бы был прямой механизм, я бы уже его задействовал...
Дааавным давно я этот вопрос прорабатывал (доп.АПИ), но т.к. в свое время оно было не востребовано, то...

Идея была следующая - чтобы плагин, имеющий на борту свои "второсортные" плагины, регистрировался у ФАРа, мол "у меня такое есть".
...а дальше, плагин для своих второуровневых предоставляет ФАРовский Info.GetMsg, вызывая который N-уровневый плагин получает правильную строку.
(более подробно нужно искать)
We are the Borg. You will be assimilated.
So Say We All!
User avatar
t-rex
Страшный и ужасный
Posts: 4910
Joined: Tue 15 Mar, 2005 16:17
Location: Tel-Aviv
Has thanked: 1 time
Been thanked: 8 times
Contact:

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by t-rex »

User avatar
Skirda
Posts: 3475
Joined: Wed 16 Mar, 2005 11:01
Been thanked: 8 times

Re: Far.Net — плагин для написания плагинов на .NET языках

Post by Skirda »

t-rex, это немного не то.
На сколько я понял, речь идет про штатную ФАРовскую поддержку языков для плагинов второго уровня, а не использование lng-файлов в других проектах.
We are the Borg. You will be assimilated.
So Say We All!
Post Reply

Return to “Обсуждение плагинов”