Разработка шаблонов через VisualStudio

shtift

Client
Регистрация
29.07.2015
Сообщения
148
Благодарностей
290
Баллы
63
Немногие знают, что можно писать и отлаживать шаблоны в VisualStudio в связке с Code Creator. Для тех, кто работал в VS, думаю не стоит объяснять почему это в разы удобнее, чем использование только лишь ProjectMaker или CodeCreator. Ранее я нигде не видел этот способ и сам наткнулся на него случайно.

Итак, разберем пошагово что нам нужно сделать, чтобы запускать проекты в VS.


Создание проекта

Запускаем CodeCreator и создаем новый C# проект:



Затем делаем экспорт проекта:



Code Creator сгенерирует все необходимые файлы проекта Visual Studio.
Открываем экспортированный проект в Visual Studio.

Структура проекта

У проекта будет следующая структура:



В файле Program.cs находится одноименный сгенерированный класс с тремя методами:
  1. GoodEnd
  2. BadEnd
  3. ExecuteCode
Основную логику нужно размещать в методе ExecuteCode.

Каждый из методов принимает в параметрах объект Instance и IZennoPosterProjectModel, таким образом мы можем обращаться к project и instance также, как и в Project Maker.


Как Visual Studio связывается с CodeCreator?

Если вы зайдете в свойства проекта и перейдете на вкладку «Отладка», то увидите примерно следующее:



При запуске проекта происходит запуск внешней программы ZennoLab.CodeRunner.exe, которой передается набор аргументов, среди которых и путь к DLL файлу библиотеки, в который компилируется проект. При запуске проекта, библиотека копируется из указанного месторасположения в папку ExternalAssemblies, после чего CodeCreator подключает ее, находит класс Program и запускает на выполнение.


Настройка проекта

Проект уже готов к выполнению, однако есть некоторые недостатки при текущих настройках.

Проблемы
Если вы захотите разбить проект на отдельные сборки (например, чтобы отделить логику работы с базой данных), то в этом случае вам потребуется вручную скопировать дополнительные библиотеки в папку ExternalAssemblies. Если этого не делать, проект не запустится, т.к. CodeRunner’у передается только путь к основному DLL файлу проекта и об остальных файлах он ничего не знает.

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

Следующий недостаток, аналогичный предыдущему, заключается в использовании сторонних сборок, например, с NuGet’а. Однажды вы обновите какой-либо из пакетов и забудете скопировать его файл в ExternalAssemblies.

И последний недостаток – если переместить файлы проекта в новое расположение, придется лезть в настройки проекта и указывать новый путь.

Решение
Чтобы избежать подобных проблем достаточно сделать автоматическое размещение всех сборок в ExternalAssemblies перед каждым запуском проекта Visual Studio.

1. Для этого зайдите в свойства проекта, перейдите на вкладку «Сборка» и укажите в качестве выходного пути путь к папке ExternalAssemblies:



2. На вкладке «Отладка» в аргументах командной строки также измените путь на путь к ExternalAssemblies:



Отладка проекта в Visual Studio

Проект готов к отладке, чтобы его запустить, убедитесь, что выполнены условия:
  1. CodeCreator должен быть запущен
  2. В CodeCreator должен быть открыт какой-нибудь проект, например, темповый проект, который мы создавали в самом начале. Если никакой проект не открыт, запустить выполнение из VisualStudio не получится. Поэтому для удобства можно сохранить тот проект и открывать, когда потребуется.
  3. Проект в CodeCreator должен быть остановлен. Это частая проблема при отладке из Visual Studio – иногда приходится прекращать отладку, нажав в Visual Studio кнопку стоп. Однако при такой остановке CodeCreator продолжает выполнение проекта и нужно вручную останавливать также и проект в CodeCreator.
Если какое-либо из условий будет не выполнено, появится следующее окно и выполнение проекта будет прекращено:



Теперь, поместите внутрь метода ExecuteCode свою логику и запустите проект. Во время выполнения произойдет подключение к инстансу и шаблон выполниться.
Дальнейшая отладка в Visual Studio ничем отличается от работы с любым другим проектом.


Продакшн

Теперь, чтобы подготовить проект к распространению, нам все же потребуется открыть ProjectMaker. Нужно создать шаблон и подключить в него dll файлы, которые у нас в итоге получились в процессе разработки в VS. После подключения достаточно добавить C# сниппет и вызвать из нашего проекта метод Program.ExecuteCode(), передав ему соответствующие экземпляры инстанса и проджекта.

Если вы хотите зашифровать ваш шаблон, простое подключение библиотек не подойдет (т.к. их исходный код легко посмотреть воспользовавшись любым декомпилятором), нужно зашифровать и их. На помощь приходит решение от разработчиков ZennoLab: не так давно в одном из обновлений была добавлена такая возможность: зашифровать зависимые библиотеки и упаковать их в шаблон.

Также рекомендую ознакомиться с моей конкурсной статьей о нестандартных фишках в разработке шаблонов.
 
Категория
Полезно

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 439
Благодарностей
3 347
Баллы
113
Последнее редактирование:

kfil

Client
Регистрация
09.09.2016
Сообщения
18
Благодарностей
16
Баллы
3
У Rider'а есть бесплатная на 30 дней пред-релизная, выходит часто (достаточно обновить, а там ещё 30 дн.), либо получить/найти "студенческую" на год.

VS - громоздкая и медленная (и ещё без решарпера), последняя версия требует регистрации, которая часто слетает, из-за неактивности аккаунта.
Было бы не плохо сделать пост аналогичный текущему только про Rider, с примером работы. Думаю многие скажут спасибо.
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 439
Благодарностей
3 347
Баллы
113
Было бы не плохо сделать пост аналогичный текущему только про Rider, с примером работы. Думаю многие скажут спасибо.
Есть готовый пример.
Надо только подправить пути к dll и настройкам ZP в аргументах запуска и учесть, что райдер не использует *.csproj.user, а хранит настройки запуска в папке .idea, так как у студии это закрытый формат.

 
  • Спасибо
Реакции: iwbh, nrg8601 и kfil

Karamzin

Client
Регистрация
24.05.2016
Сообщения
214
Благодарностей
431
Баллы
63
Почему не могу сохранить профили в VS?
PHP:
System.ServiceModel.FaultException
  HResult=0x80131501
  Message=Сервер не смог обработать запрос в связи с внутренней ошибкой.  Для получения дополнительных сведений об ошибке либо включите IncludeExceptionDetailInFaults (с помощью атрибута ServiceBehaviorAttribute или через поведение < serviceDebug >) на сервере для того чтобы выслать информацию об исключении назад клиенту, или включить трассировку согласно инструкции Microsoft .NET Framework SDK и проверить записи журнала трассировки клиента.
  Source=mscorlib
  StackTrace:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at ZennoLab.InterfacesLibrary.CodeCreator.ICodeRunnerService.InvokeCommand(String sender, String command, String[] args)
   at ZennoLab.CodeRunner.ProjectProxy.ProfileProxy.Save(String path, Boolean saveProxy, Boolean savePlugins, Boolean saveLocalStorage, Boolean saveTimezone, Boolean saveGeoposition, Boolean saveSuperCookie, Boolean saveFonts, Boolean saveWebRtc, Boolean saveIndexedDb, String[] saveVariables)
   at x.Program.ExecuteCode(Instance instance, IZennoPosterProjectModel project) in D:\x\Program.cs:line 75
   at Zennolab.CodeRunner.Program.ProjectDebug(Assembly dll, Instance inst, IZennoPosterProjectModel project, Boolean external)
   at Zennolab.CodeRunner.Program.Main(String[] args)
 

JanCarlo

Client
Регистрация
04.03.2018
Сообщения
355
Благодарностей
40
Баллы
28
Господа, извиняюсь за поднятие старой темы, но хотел бы уточнить, у меня проект в вижуал, после компиляции получаю exe файл, можно ли его как то обфусцировать средствами зенки? а то голый exe любым декомпилятором открыть можно открыть
 

Yuriy Zymlex

Moderator
Команда форума
Регистрация
24.10.2016
Сообщения
6 439
Благодарностей
3 347
Баллы
113

stud

Client
Регистрация
23.06.2013
Сообщения
88
Благодарностей
139
Баллы
33

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
198
Баллы
43
В самом коде dll присутсвует
в кубике прописал

Program.ExecuteCode(instance, project);
Компиляция кода Ошибка в действии "CS0120" "Для нестатического поля, метода или свойства "parser.Program.ExecuteCode(ZennoLab.CommandCenter.Instance, ZennoLab.InterfacesLibrary.ProjectModel.IZennoPosterProjectModel)" требуется ссылка на объект". [Строка: 0; Cтолбец: 1]
в ПМ есть и список такой и переменная
 
Последнее редактирование:

radv

Client
Регистрация
11.05.2015
Сообщения
3 741
Благодарностей
1 928
Баллы
113
В самом коде dll присутсвует
C#:
public int ExecuteCode(Instance instance, IZennoPosterProjectModel project)
        {
            IZennoList pages = project.Lists["pages"];
            pages.Bind(project.Variables["path_Links"].Value);
    .........
в кубике прописал

Program.ExecuteCode(instance, project);

в ПМ есть и список такой и переменная
Нужно через конструктор сделать


Ты пытаешься обратиться к не статическому методу. Через точку можно обращаться только к статическим методам. А если создашь объект этого класса, то через точку сможешь обращаться к нужному не статическому методу.
 
Последнее редактирование:
  • Спасибо
Реакции: AZANIR

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
198
Баллы
43
вообщем
спасибо Антону разобрался
для тех кто не будет знать как делать и чтоб понимать что происходит

создаем экземпляр класса и передаем ему инстанс и проджект


C#:
Program Potok = new Program();
Potok.ExecuteCode(instance, project);
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)