Данный мануал предназначен для разработчиков, которые хотят выпустить свой плагин к программе Цербер
Для начала необходимо скачать последнюю версию программы и распаковать ее в папку, например D:\TestAPI
Далее создаем проект (в примере я буду использовать Visual Studio 2010, C# и framework 3.5).
В качестве шаблона необходимо использовать "Библиотеку классов". Назовем проект ZerberTestAPI, в принципе название проекта не имеет значения, важно, чтобы имя компилируемого файла соответствовало маске Zerber[Name].dll
[Name] — это внутреннее имя плагина, более подробно объясню немного ниже.
Далее заходим в свойства проекта и во вкладке "Построение" выбираем в качестве пути вывода папку, куда мы предварительно распаковали программу.
Теперь необходимо указать ссылку на Zerber.exe
Далее необходимо создать форму TaskForm.cs для редактирования настроек макроса и класс TheProcessor.cs в котором будет выполняться основной код плагина.
Итого мы имеем 2 класса — Class1.cs, TheProcessor.cs и 1 форму — TaskForm.cs. Теперь по порядку, разберем каждый класс.
public class Class1 : IPlugin
{
public string Name { get { return "TestAPI"; } } //внутреннее имя плагина,
//имя файла в которое будет скомпилирован плагин обязательно должно соответствовать маске Zerber[Name].dll
//таким образом Zerber.exe поймет в какой плагин отправлять выполнение задания
//например в нашем случае плагин должнен компилироваться в файл ZerberTestAPI.dll
public string Description { get { return "Тестовый плагин"; } } //описание плагина
public static string Type { get { return "TestAPI"; } } //тип плагина
public static string Action { get { return "Протестировать API"; } } //действие плагина
public string AuthorName { get { return "Spartanets"; } } //автор плагина
public string Version { get { return "1"; } } //версия плагина
private Global global; //глобальная переменаая для обмена данными между плагином и Zerber.exe
public void Initialize(Global _global, object tsm_project_add_task, bool Go)
{
global = _global; //получаем переменную
//Go это bool переменная:
//true то программа отправляет задание на выполнение,
//false открывает форму редактирования задания
if (Go)
{
try
{
var proc = new TheProcessor(global); //TheProcessor класс, выполняющий задание
proc.LetsGo(); //LetsGo() основная функция TheProcessor
//делаем задание завершенным
global.pt.ctask.State = "Завершенный";
global.pt.Serialise();
return;
}
catch (Exception)
{
return;
}
}
//помимо переменной Go zerber передает в плагин переменную global.pt.ctask,
//которая содержит информацию о текущем выполняемом задании
//если значение global.pt.ctask == null программа просто добавляет кнопку в список заданий tsm_project_add_task
if (global.pt.ctask == null)
{
if (tsm_project_add_task != null)
{
var mnu = (ToolStripMenuItem)tsm_project_add_task;
var item = new ToolStripMenuItem { Text = Description };
item.Click += item_Click;
mnu.DropDownItems.Add(item);
}
return;
}
//если значение Go==false и global.pt.ctask != null плагин откроет форму редактирования задания
var frm = new TaskForm(global);
frm.ShowDialog();
}
//открываем форму для добавления задания
void item_Click(object sender, EventArgs e)
{
var frm = new TaskForm(global);
frm.ShowDialog();
}
public void Dispose()
{
}
}
Теперь займемся формой. В примере плагин будет выводить указанной сообщение. Можно так же задать цикличность и указать сколько раз повторить цикл (это для того, чтобы показать как работать с настройками string, bool и int).
Расположим на форме следующие элементы:

public partial class TaskForm : Form
{
public TaskForm(Global _global)
{
global = _global;
InitializeComponent();
}
private readonly Global global;
private void TaskForm_Load(object sender, System.EventArgs e)
{
/*---standart---*/
comboState.Items.Add("Новый");
comboState.Items.Add("Завершенный");
comboState.Items.Add("Незавершенный");
comboState.Text = @"Новый";
if (string.IsNullOrEmpty(global.pt.ctask.Name))//если задание новое
{
labelTaskName.Text = global.pt.PrepareTaskName(Class1.Action);
return;
}
labelTaskName.Text = global.pt.ctask.Name;
labelTaskName.ReadOnly = true;
comboState.Text = global.pt.ctask.State;
/*---standart---*/
//Считываем настройки
//Для сохранения и считывания настроек используются 2 функции:
//global.pt.ctask.SaveItem для сохранения
//тут все очень просто: задается имя переменной и значение, все значения записываются в string, например
//global.pt.ctask.SaveItem("Имя_переменной", "Значение");
//global.pt.ctask.LoadItem для считывания
//для удобства у функции есть 2 перегрузки
//global.pt.ctask.LoadItem("Имя_переменной"); — вернет значение переменной в string
//global.pt.ctask.LoadItem("Имя_переменной", true/false); — попытается вернуть значение переменной в bool,
//при этом true или false значение по умолчанию, если не удастся вернуть bool
//global.pt.ctask.LoadItem("Имя_переменной", 0); — тоже самое, но для integer
textBox_Message.Text = global.pt.ctask.LoadItem("Message");
checkBox_Loop.Checked = global.pt.ctask.LoadItem("Loop", false);
numericUpDown_Count.Value = global.pt.ctask.LoadItem("Count", 1);
}
private void buttonReady_Click(object sender, System.EventArgs e)
{
/*---standart---*/
if (string.IsNullOrEmpty(global.pt.ctask.Name))//если задание новое
{
global.pt.ctask.Name = labelTaskName.Text;
global.pt.ctask.Type = Class1.Type;
global.pt.ctask.State = "Новый";
global.pt.ctask.Create();
global.pt.CurrentProject.AddTask(global.pt.ctask.Name, global.pt.ctask.State, global.pt.ctask.Type);
global.pt.CurrentProjectNode.Nodes.Add(new TreeNode(global.pt.ctask.Name, 3, 3));
}
global.pt.ctask.State = comboState.Text;
/*---standart---*/
//Сохраняем настройки
global.pt.ctask.SaveItem("Message", textBox_Message.Text);
global.pt.ctask.SaveItem("Loop", checkBox_Loop.Checked.ToString());
global.pt.ctask.SaveItem("Count", numericUpDown_Count.Value.ToString());
/*---standart---*/
global.pt.ctask.Save(); //сохраняем задание
global.pt.ShowProjects(); //обновляем дерево заданий
Close(); //закрываем форму
/*---standart---*/
}
}
Теперь наш плагин умеет сохранять и редактировать настройки, осталось создать код, который будет выполнять основную работу.
Здесь думаю комментарии излишни
public class TheProcessor
{
public TheProcessor(Global _global)
{
global = _global;
}
private readonly Global global = new Global();
public void LetsGo()
{
//Считываем настройки
var message = global.pt.ctask.LoadItem("Message");
var loop = global.pt.ctask.LoadItem("Loop", false);
var count = global.pt.ctask.LoadItem("Count", 1);
if (loop) for (var i = 0; i < count; i++) MessageBox.Show(message);
else MessageBox.Show(message);
}
}
Все, наш плагин готов!
Если вам надо что-либо добавить в API или что-то не понятно, вы всегда можете обратиться ко мне в контакты.
Я никаким образом не ограничиваю разработчиков, которые пишут свои плагины. Напротив, если плагин интересный, я размещу о нем информацию в своем блоге и каталоге плагинов с контактами автора.