Долгожданное продолжение первой части.
А теперь можно попробовать подружить D Form Library 2 (DFL2) с Monodevelop/MonoD.Для этого создадим простой пример и откомпилируем его с помощью Monodevelop.
Для того, чтобы начать, потребуется создать проект (одна из минимальных единиц сборки в Xamarin Studio), для чего в меню File выбираем пункт Solution… и в результате видим такой мастер:
В котором выбираем пункт Empty D Project и жмем кнопку Next, переходя на следующий этап работы мастера создания решения:
В текстовом поле Project Name вводим имя проекта, в текстовое поле Solution Name – имя решения (эти два пункта в данном случае совпадают, а могут и не совпадать), а в Location указывается, где будет расположен проект.
Галочка под Location обозначает создание внутренней папки с именем решения, куда будут помещены все исходники – рекомендуется оставить эту пометку как есть, но если хочется иного варианта, то можете смело действовать. Остальные пункты предназначены для управления контролем версий (обычно, у меня на компьютере уже стоит Git, а потому эти пункты я не трогаю) и их можете расставить по своему вкусу.
Нажимаем кнопку Create, после чего получаем примерно вот такую жизнерадостную картинку:
Как видите – ни одного файла, только голая папка проекта и все.
Для исправления ситуации в панели Solution (это та, которая слева на скриншоте и которая открывается по щелчку левой клавиши мыши на слове Solution) находим синий значок с подписью, совпадающей с именем проекта, и нажимаем на него правой клавишей мыши и выбираем пункт меню Add и его подпункт New File…:
Далее выбираем Empty File, вводим имя файла и нажимаем кнопку New:
В итоге, получаем свежесозданный новый файл, который является частью проекта и который уже открыт на редактирование.
Для эксперимента, нарисуем в Entice Designer простенькую форму, скопируем весь код в наш файл (в данном случае, он зовется main.d), поправим процедуру main, как было описано в одной из статей про DFL и сохраним:
А вот теперь начинается самое интересное…
Чтобы подружить D Form Library с Monodevelop потребуется явно указать в свойствах решения, какие библиотеки будут линковаться и откуда надо брать определения для секций импорта.
Осуществить это можно следующим образом: нажимаем правой клавишей на имени проекта в панели Solution и в уже знакомом меню выбираем пункт Options, который выглядит примерно так:
Первый пункт, который нас интересует это раздел Build пункт Compiling.
Именно в этом пункте можно настроить линкуемые библиотеки и некоторые опции компилятора по отношению к проекту и именно в этом пункте есть такое понятие как конфигурация сборки (обратите внимание на выпадающий список перед которым написано Configuration), т.е. набор некоторых параметров компиляции, линковки и т.д, имеющих некоторое осмысленное название и содержащих некоторую логическую цепочку действий по сборке программы.
Конфигураций сборки, по традиции, две: Debug – отладочная сборка и Release – конечная, итоговая сборка, и нас интересуют обе, поскольку они слегка отличаются в плане настройки.
В пункте Compiling выбираем из списка Configuration конфигурацию Debug, далее в текстовое поле Libraries вставляем следующее:
dfl_debug.lib ole32.lib oleAut32.lib gdi32.lib Comctl32.lib Comdlg32.lib advapi32.lib uuid.lib ws2_32.lib
И ниже под этим текстовым поле ставим флажок Link in static/shared libraries from nested dependencies (Статическая линковка для библиотек из вложенных зависимостей), тем самым показывая компилятору с какими библиотеками пойдет связывание исполняемого файла и каким образом оно произойдет:
На этом настройка отладочной конфигурации завершена и аналогичным образом мы настраиваем конечную, релизную конфигурацию, но для того, чтобы отладочная консоль не появлялась во время запуска итоговой сборки, добавляем в Release в текстовое поле Extra Linker Options следующее:
L/SUBSYSTEM:WINDOWS:4.0
Библиотеки спешно указаны и осталось дело за малым, осталось указать откуда берутся импорты, для чего нам потребуется пункт Includes. Действия предельно просты: выбираем Includes и дальше жмем на кнопку Browse & Add и в открывшемся диалоге выбираем папку, куда копировали исходники DFL2:
Вот собственно и все, теперь можно компилировать и запускать: выбираем в верхней панели среды конфигурацию и либо нажимаем кнопку с треугольником, либо нажимаем Ctrl + F5 (что соответствует запуску без отладчика):
Как видно приложение запущено в режиме отладки, а черное окно которое видно за приложением есть нечто иное как внешняя консоль IDE, на которую может выводиться какая-нибудь информация (консоль стартует почти всегда и отключить ее появление можно в настройках, вот только где оно находиться, я не помню) и кроме того, консоль дает вам уникальную возможность – если приложение зависло во время старта, то отключить его вы можете просто закрыв окно консоли.
Код примера:
module main; /* Generated by Entice Designer Entice Designer written by Christopher E. Miller www.dprogramming.com/entice.php */ import dfl.all; class MyForm: dfl.form.Form { // Do not modify or move this block of variables. //~Entice Designer variables begin here. dfl.textbox.TextBox textBox1; dfl.button.Button button1; //~Entice Designer variables end here. this() { initializeMyForm(); //@ Other MyForm initialization code here. } private void initializeMyForm() { // Do not manually modify this function. //~Entice Designer 0.8.5.02 code begins here. //~DFL Form text = "My Form"; clientSize = dfl.all.Size(352, 138); //~DFL dfl.textbox.TextBox=textBox1 textBox1 = new dfl.textbox.TextBox(); textBox1.name = "textBox1"; textBox1.bounds = dfl.all.Rect(16, 32, 312, 24); textBox1.parent = this; //~DFL dfl.button.Button=button1 button1 = new dfl.button.Button(); button1.name = "button1"; button1.text = "тест!"; button1.bounds = dfl.all.Rect(216, 72, 112, 24); button1.parent = this; //~Entice Designer 0.8.5.02 code ends here. } } int main() { int result = 0; try { Application.enableVisualStyles(); Application.run(new MyForm); } catch(DflThrowable o) { msgBox(o.toString(), "Fatal Error", MsgBoxButtons.OK, MsgBoxIcon.ERROR); result = 1; } return result; }
И ради интереса, скриншот одного реального проекта: