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

shtift

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

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


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

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

gpIVDBg.png


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

3SKR0oY.png


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

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

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

kV9IMgQ.png


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

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


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

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

gSNx3Ny.png


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


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

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

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

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

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

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

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

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

ftKFovb.png


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

H1NlOOv.png


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

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

a2gxEMJ.png


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


Продакшн

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

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

Также рекомендую ознакомиться с моей конкурсной статьей о нестандартных фишках в разработке шаблонов.
 
Категория
  1. Полезно
Последнее редактирование:
У Rider'а есть бесплатная на 30 дней пред-релизная, выходит часто (достаточно обновить, а там ещё 30 дн.), либо получить/найти "студенческую" на год.

VS - громоздкая и медленная (и ещё без решарпера), последняя версия требует регистрации, которая часто слетает, из-за неактивности аккаунта.
Было бы не плохо сделать пост аналогичный текущему только про Rider, с примером работы. Думаю многие скажут спасибо.
 
Было бы не плохо сделать пост аналогичный текущему только про Rider, с примером работы. Думаю многие скажут спасибо.
Есть готовый пример.
Надо только подправить пути к dll и настройкам ZP в аргументах запуска и учесть, что райдер не использует *.csproj.user, а хранит настройки запуска в папке .idea, так как у студии это закрытый формат.

 
  • Спасибо
Реакции: iwbh, nrg8601 и kfil
Почему не могу сохранить профили в 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)
 
Господа, извиняюсь за поднятие старой темы, но хотел бы уточнить, у меня проект в вижуал, после компиляции получаю exe файл, можно ли его как то обфусцировать средствами зенки? а то голый exe любым декомпилятором открыть можно открыть
 
В самом коде dll присутсвует
в кубике прописал

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

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


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

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


C#:
Развернуть Свернуть Копировать
Program Potok = new Program();
Potok.ExecuteCode(instance, project);
 

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