{"id":318933,"date":"2021-03-03T09:00:22","date_gmt":"2021-03-03T09:00:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=318933"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=318933","title":{"rendered":"\u041f\u0438\u0448\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u043d\u0430 WixSharp. \u041f\u043b\u044e\u0448\u043a\u0438, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/661\/ce8\/270\/661ce82708214c2cd271cf52ebab1ed6.png\" width=\"580\" height=\"170\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0430\u043b\u043e\u043c\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438 \u0442\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0439\u043c\u0443 \u0432\u0441\u0435\u0433\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0432 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0443 \u044d\u0442\u0430\u043f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0432\u043e\u0435\u0439 \u0440\u0435\u0438\u043d\u043a\u0430\u0440\u043d\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0440\u0433\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 \u0441\u043e\u0443\u0441\u043e\u043c InnoSetup. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u0418 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0441\u0442\u044c \u043d\u0430 &#171;\u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b&#187; \u0438 \u0442\u0443\u0442 \u043f\u043e\u043d\u0435\u0441\u043b\u043e\u0441\u044c\u2026<\/p>\n<h3>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Wix, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438 WixSharp<\/h3>\n<p>\u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Wix. \u041d\u043e \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u044c xml \u0441\u043a\u0440\u0438\u043f\u0442\u044b Wix \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0438 C#. \u0418, \u0443\u0440\u0430, \u0431\u044b\u043b \u0437\u0430\u043c\u0435\u0447\u0435\u043d \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Wix# (WixSharp). <\/p>\n<p>\u041f\u043e Wix# \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0441\u0435\u0442\u0438 \u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<p>Wix# \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f msi. \u0422\u0430\u043a\u0436\u0435, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f wix \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 Wix. \u041f\u0440\u0438\u044f\u0442\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c WPF. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u043d\u0430 WinForm. \u0418 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0432\u044b\u044f\u0432\u0438\u043b\u0438 \u0440\u044f\u0434 \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinForm<\/h3>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u043e\u0440\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u0444\u043e\u0440\u043c \u0432 msi.<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4d8\/971\/946\/4d8971946cc70525fa2a817de76b89a2.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u044b\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u044b\" width=\"745\" height=\"586\"><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u044b<\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0430\u043c \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0418 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0440\u043c. \u041d\u043e&#8230;<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0431\u0440\u043e\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0440\u043c, \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441 &#171;\u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c&#187;. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a \u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0432\u043e \u0432\u043d\u043e\u0432\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u0434 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0412 \u044d\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinForm msi.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0410 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c UI \u043d\u0430 WPF.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 Wix# \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0446\u0438\u0439. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">var binaries = new Feature(\"Binaries\", \"Product binaries\", true, false); var docs = new Feature(\"Documentation\", \"Product documentation (manuals and user guides)\", true); var tuts = new Feature(\"Tutorials\", \"Product tutorials\", false); docs.Children.Add(tuts);  var project = \tnew ManagedProject(\"ManagedSetup\", \t\tnew Dir(@\"%ProgramFiles%\\My Company\\My Product\", \t\t\tnew File(binaries, @\"Files\\bin\\MyApp.exe\"), \t\t\tnew Dir(\"Docs\", \t\t\t\tnew File(docs, \"readme.txt\"), \t\t\t\tnew File(tuts, \"setup.cs\"))));   project.Binaries = new[] { \tnew Binary(new Id(\"EchoBin\"), @\"Files\\Echo.exe\") };  project.Actions = new WixSharp.Action[] { \tnew InstalledFileAction(\"registrator_exe\", \"\/u\", Return.check, When.Before, Step.InstallFinalize, Condition.Installed), \tnew InstalledFileAction(\"registrator_exe\", \"\", Return.check, When.After, Step.InstallFinalize, Condition.NOT_Installed), \tnew PathFileAction(@\"%WindowsFolder%\\notepad.exe\", @\"C:\\boot.ini\", \"INSTALLDIR\", Return.asyncNoWait, When.After, Step.PreviousAction, Condition.NOT_Installed), \tnew ScriptAction(@\"MsgBox \"\"Executing VBScript code...\"\"\", Return.ignore, When.After, Step.PreviousAction, Condition.NOT_Installed), \tnew ScriptFileAction(@\"Files\\Sample.vbs\", \"Execute\" , Return.ignore, When.After, Step.PreviousAction, \"NOT Installed\"), \tnew BinaryFileAction(\"EchoBin\", \"Executing Binary file...\", Return.check, When.After, Step.InstallFiles, Condition.NOT_Installed) \t{ \t\tExecute = Execute.deferred \t} }; \t project.Properties = new[] { \t\tnew Property(\"Gritting\", \"Hello World!\"), \t\tnew Property(\"Title\", \"Properties Test\"), \t\tnew PublicProperty(\"NOTEPAD_FILE\", @\"C:\\boot.ini\") } \t project.GUID = new Guid(\"6f330b47-2577-43ad-9095-1861ba25889b\"); project.ManagedUI = ManagedUI.Default; project.UIInitialized += Project_UIInitialized; project.Load += msi_Load; project.AfterInstall += msi_AfterInstall;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0430\u0437\u043d\u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0432\u0438\u0434:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">var project = new ManagedProject(ProjectConstants.PROJECT_NAME) { \tGUID = new Guid(ProjectConstants.PROJECT_GUID), \tPlatform = Platform.x64, \tUpgradeCode = new Guid(ProjectConstants.PROJECT_GUID), \tInstallScope = InstallScope.perMachine, \tDescription = ProjectConstants.COMPANY_NAME, \tLanguage = \"ru-RU\", \tLocalizationFile = @\"WixUI_ru-ru.wxl\", \tControlPanelInfo = productInfo, \tMajorUpgradeStrategy = upgradeStrategy, \tMajorUpgrade = majorUpgrade, \tDefaultRefAssemblies = RefAssembliesGenerator.InitializeRefAssemblies(), \tGenericItems = GenericEntitiesGenerator.InitializeGenericEntities(), \tProperties = PropertiesGenerator.InitializeProperties(), \tDirs = DirsGenerator.InitializeDirs(), \tBinaries = BinariesGenerator.InitializeBinaries(), \tActions = ActionsGenerator.InitializeActions(), \tManagedUI = new ManagedUI(), \tReinstallMode = \"amus\" };<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 msi<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432 (Property), \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c, \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043a\u0430\u043a \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Custom Action. <\/p>\n<p>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0438\u0445 \u0438\u043c\u0435\u043d\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>new Property(\"Gritting\", \"Hello World!\")<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0434\u0430\u043b\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <code>Runtime.Session[\"Gritting \"]<\/code><\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u043e\u0435 \u0435\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 runtime \u0438 \u043f\u0440\u0438 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 enum \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u044d\u0442\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u0442\u0430\u043b\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public enum eProperties {  \t[Value(\"Hello World!\"))]  \tGRITTING,  \t[Value(\"Properties Test \"))]  \tTITLE,  \t\/\/ \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0441\u0430\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 enum \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public static class PropertiesGenerator { \tprivate static Property InizializeProperty(string propertyName, string propertyValue) \t{ \t\treturn new Property(new Id(propertyName), propertyName, propertyValue) { IsDeferred = true }; \t}  \tprivate static IList&lt;T&gt; ToTypedList&lt;T&gt;(Type entityType, Func&lt;Enum, T&gt; createFunc) \t{ \t\tif (createFunc != null \t\t\t&amp;&amp; entityType.IsEnum) \t\t{ \t\t\treturn Enum.GetValues(entityType) \t\t\t\t.Cast&lt;Enum&gt;() \t\t\t\t.Select(createFunc) \t\t\t\t.ToList(); \t\t} \t\treturn null; \t}  \tpublic static Property[] InitializeProperties() \t{ \t\treturn ToTypedList(typeof(eProperties), \t\t\te =&gt; InizializeProperty(e.ToString(), e.GetPropertyValue())) \t\t\t.ToArray(); \t} }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e <code>this.GetData(GRITTING)<\/code>, \u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c<code>&nbsp;this.SetData(GRITTING, \u201cNew value\u201d)<\/code>, \u0433\u0434\u0435 GetData() \u0438 SetData() \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 ManagedForm.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 Custom Action \u0441\u0442\u0430\u043b\u043e <code>session.Data(GRITTING)<\/code><\/p>\n<h3>MSI \u043d\u0443\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h3>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0421\u0423\u0411\u0414 Postgre). \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0432\u0441\u0435 \u0440\u0443\u0447\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Wix#:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">project.DefaultRefAssemblies.Add(\"FontAwesome.Sharp.dll\"); project.DefaultRefAssemblies.Add(\"Newtonsoft.Json.dll\"); project.DefaultRefAssemblies.Add(\"ManagedOpenSsl.dll\");<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 dll  \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static List&lt;string&gt; GetResourceList(string resourcesDirPath) =&gt; \tDirectory.GetFiles($@\"{resourcesDirPath}\\\") \t\t.Where(file =&gt; file.EndsWith(\"dll\")) \t\t.ToList();  public static List&lt;string&gt; InitializeRefAssemblies() =&gt; \tGetResourceList(Application.StartupPath) \t\t.Concat(GetResourceList(\"Resources\")) \t\t.ToList();<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432<\/h3>\n<p>C \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0438, \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static bool ServicePredicate(string file) =&gt; !file.EndsWith(\".pdb\");  private static IEnumerable&lt;WixEntity&gt; InitializeDirWixEntities(object dirName) { \tvar items = new List&lt;WixEntity&gt;(); \titems.AddRange(new List&lt;WixEntity&gt; \t{ \t\tnew Dir(\"logs\"), \t\tnew DirFiles($@\"Sources\\{dirName}\\*.*\", ServicePredicate) \t}); \treturn new[] { new Dir(dirName.ToString(), items.ToArray()) }; }  private static WixEntity[] InilizeDirItems() =&gt; \tnew List&lt;WixEntity&gt;() \t\t.Concat(InitializeDirWixEntities(FirstService)) \t\t.Concat(InitializeDirWixEntities(SecondService)) \t\t.Concat(InitializeDirWixEntities(ThirdService)) \t\t.Concat(InitializeDirWixEntities(FourthService)) \t\t.ToArray();  public static Dir[] InitializeDirs() =&gt; \tnew[] \t{ \t\tnew Dir(@\"%ProgramFiles%\\CompanyName\\\", \t\t\tnew Dir(\"distr\", \t\t\t\tnew Dir(FluentMigrator, GetMigratorFileList(\"FluentMigrator\")), \t\t\t\t), \t\t\tnew Dir(\"app\", InilizeDirItems()) \t\t) \t};  <\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/37d\/462\/022\/37d46202241911407e4e7c45a9cd39de.png\" width=\"628\" height=\"152\"><figcaption><\/figcaption><\/figure>\n<h3>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u043e\u0432 \u043d\u0430 IIS<\/h3>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0430\u0439\u0442\u043e\u0432\/\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 IIS, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f https \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 ssl. \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Wix# \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u043b (\u0434\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 1.14.3). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Wix, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 WixExtension.Iis.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 Wix \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u043d\u0430 IIS:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public abstract class IISWebSite: WixEntity, IGenericEntity { \t[Xml] \tpublic string Condition;  \t[Xml] \tpublic string Description;  \t[Xml] \tpublic string IpAddress;  \t[Xml] \tpublic string Port;  \tprotected string Prefix { get; }  \tprotected XElement Component { get; private set; }  \tprotected string DirId { get; private set; }  \tprotected string DirName { get; private set; }  \tprotected string WebAppPoolId { get; private set; }  \tprotected IISWebSite(string prefix) \t{ \t\tPrefix = prefix; \t}  \tpublic virtual void Process(ProcessingContext context) \t{ \t\tcontext.Project.Include(WixExtension.IIs);  \t\tDirId = context.XParent.Attribute(\"Id\").Value; \t\tDirName = context.XParent.Attribute(\"Name\").Value;  \t\tvar componentId = $\"{DirName}.{Prefix}.Component.Id\"; \t\tComponent = new XElement(XName.Get(\"Component\"), \t\t\tnew XAttribute(\"Id\", componentId), \t\t\tnew XAttribute(\"Guid\", WixGuid.NewGuid(componentId)), \t\t\tnew XAttribute(\"KeyPath\", \"yes\"));  \t\tcontext.XParent.Add(Component);  \t\tComponent.Add(new XElement(\"Condition\", new XCData(Condition)));  \t\tWebAppPoolId = $\"{DirName}.{Prefix}.WebAppPool.Id\"; \t\tComponent.Add(new XElement(WixExtension.IIs.ToXName(\"WebAppPool\"), \t\t\tnew XAttribute(\"Id\", WebAppPoolId), \t\t\tnew XAttribute(\"Name\", $\"AppPool{Description}\") \t\t)); \t} }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0441-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a, \u0434\u043b\u044f c\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e http:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public sealed class IISWebSiteHttp : IISWebSite { \tpublic IISWebSiteHttp() : base(\"Http\") \t{ \t}  \tpublic override void Process(ProcessingContext context) \t{ \t\tbase.Process(context); \t\t \t\tComponent.Add(new XElement(WixExtension.IIs.ToXName(\"WebSite\"), \t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebSite.Id\"), \t\t\tnew XAttribute(\"Description\", Description), \t\t\tnew XAttribute(\"Directory\", DirId), \t\t\tnew XElement(WixExtension.IIs.ToXName(\"WebAddress\"), \t\t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebAddress.Id\"), \t\t\t\tnew XAttribute(\"IP\", IpAddress), \t\t\t\tnew XAttribute(\"Port\", Port), \t\t\t\tnew XAttribute(\"Secure\", \"no\") \t\t\t\t), \t\t\tnew XElement(WixExtension.IIs.ToXName(\"WebApplication\"), \t\t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebSiteApplication.Id\"), \t\t\t\tnew XAttribute(\"WebAppPool\", WebAppPoolId), \t\t\t\tnew XAttribute(\"Name\", $\"AppPool{Description}\")) \t\t\t)); \t} }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0418 \u043a\u043b\u0430\u0441\u0441-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u0441 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e https \u0438 \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 ssl:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public sealed class IISWebSiteHttps : IISWebSite { \tprivate readonly bool _haveCertRef;  \tpublic IISWebSiteHttps(bool haveCertRef) : base(haveCertRef ? \"HttpsCertRef\" : \"Https\") \t{ \t\t_haveCertRef = haveCertRef; \t}  \tpublic override void Process(ProcessingContext context) \t{ \t\tbase.Process(context);  \t\tvar siteConfig = new XElement(WixExtension.IIs.ToXName(\"WebSite\"), \t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebSite.Id\"), \t\t\tnew XAttribute(\"Description\", Description), \t\t\tnew XAttribute(\"Directory\", DirId), \t\t\tnew XElement(WixExtension.IIs.ToXName(\"WebAddress\"), \t\t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebAddress.Id\"), \t\t\t\tnew XAttribute(\"IP\", IpAddress), \t\t\t\tnew XAttribute(\"Port\", Port), \t\t\t\tnew XAttribute(\"Secure\", \"yes\") \t\t\t), \t\t\tnew XElement(WixExtension.IIs.ToXName(\"WebApplication\"), \t\t\t\tnew XAttribute(\"Id\", $\"{DirName}.{Prefix}.WebSiteApplication.Id\"), \t\t\t\tnew XAttribute(\"WebAppPool\", WebAppPoolId), \t\t\t\tnew XAttribute(\"Name\", $\"AppPool{Description}\")));  \t\tif (_haveCertRef) \t\t{ \t\t\tsiteConfig.Add(new XElement(WixExtension.IIs.ToXName(\"CertificateRef\"), \t\t\t\tnew XAttribute(\"Id\", IISConstants.CERTIFICATE_ID))); \t\t}  \t\tComponent.Add(siteConfig); \t} }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0430\u0439\u0442\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043d\u0430 \u0444\u043e\u0440\u043c\u0430\u0445 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 \u043d\u043e\u0432\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u0430.<\/p>\n<p>\u0427\u0435\u0440\u0435\u0437 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0440\u0435\u043b\u0438\u0437 Wix# \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u0445\u043e\u0436\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435. \u041d\u043e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435, \u043d\u0430\u0448\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0443 \u0441\u0430\u0439\u0442\u043e\u0432 \u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0443 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 ssl.<\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">new List&lt;WixEntity&gt; \t{ \t\tnew IISWebSiteHttp \t\t{ \t\t\tCondition = HttpSiteCondition, Description = siteName, \t\t\tIpAddress = ipAddress, \t\t\tPort = port \t\t}, \t\tnew IISWebSiteHttps(false) \t\t{ \t\t\tCondition = HttpsSiteWithoutCertCondition, Description = siteName, \t\t\tIpAddress = ipAddress, \t\t\tPort = port \t\t}, \t\tnew IISWebSiteHttps(true) \t\t{ \t\t\tCondition = HttpsSiteWithCertCondition, Description = siteName, \t\t\tIpAddress = ipAddress, \t\t\tPort = port \t\t} \t}<\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d91\/e78\/0ea\/d91e780ea2d49cdda63858c57fc19181.png\" width=\"1032\" height=\"300\"><figcaption><\/figcaption><\/figure>\n<h3>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0411\u0414 \u0438\u0437 msi<\/h3>\n<p>\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\/\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0411\u0414 \u0434\u0435\u043b\u0430\u043b\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0422\u0430\u043a \u043a\u0430\u043a Wix# \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u0432\u043e\u0438 Custom Action, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 \u043f\u0440\u044f\u043c\u043e \u0432 msi. <\/p>\n<p>\u0412 \u0444\u043e\u0440\u043c\u0430\u0445 \u0437\u0430\u043d\u043e\u0441\u044f\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0411\u0414 (\u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440, \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435) \u0438 \u0432 Custom Action \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[CustomAction] public static ActionResult ExecMigratorRunner(Session session) { \tvar workDir = session.Data(MIGRATOR_FILE_DIR); \tvar appCmdFile = $@\"{workDir}{session.Data(MIGRATOR_FILE_NAME)}\"; \tvar args = session.Data(MIGRATOR_ARGS);  \treturn ProccessHelper.RunApplication(appCmdFile, args); }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u043f\u044b\u0442\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0441\u043f\u0440\u043e\u0441\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f Wix#? \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">var project = new Project(\"MyProduct\", \tnew Dir(@\"%ProgramFiles%\\My Company\\My Product\", \t\tnew File(@\"Files\\Bin\\MyApp.exe\")), \t \tnew User(\"James\") { Password = \"Password1\" }, \tnew Binary(new Id(\"script\"), \"script.sql\"), \t \tnew SqlDatabase(\"MyDatabase0\", \".\\\\SqlExpress\", SqlDbOption.CreateOnInstall, \t\tnew SqlScript(\"script\", ExecuteSql.OnInstall), \t\tnew SqlString(\"alter login Bryce with password = 'Password1'\", ExecuteSql.OnInstall) \t\t) \t);<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Fluent Migrator. \u0418 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0411\u0414 \u043d\u0443\u0436\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u043e\u0439 \u0411\u0414. \u0410 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432 \u0421\u0423\u0411\u0414 \u043b\u043e\u0436\u0438\u0442\u0441\u044f \u0443\u0436\u0435 \u043d\u0430 \u0441\u0430\u043c\u0443 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443.<\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0411\u0414 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0432\u0441\u0435\u043c \u043a\u0430\u043d\u043e\u043d\u0430\u043c \u043d\u0430\u043a\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0439.<\/p>\n<h3>\u041a\u0430\u043a\u043e\u0439 \u0435\u0449\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438?<\/h3>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0430\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043d\u0430 \u043f\u0430\u043f\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0435\u0440\u0435\u0437 CustomAction, \u0442.\u043a. \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u0438 \u043c\u044b \u043d\u0435 \u043d\u0430\u0448\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Wix.<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0411\u0414 \u0438 \u0421\u0423\u0411\u0414 (\u0447\u0435\u0440\u0435\u0437 CustomAction, \u043f\u043e \u0442\u0435\u043c \u0436\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c).<\/p>\n<\/li>\n<li>\n<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 ssl \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 \u0432\u043d\u043e\u0432\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 ssl \u043a \u0441\u0430\u0439\u0442\u0430\u043c \u043d\u0430 IIS (\u0447\u0435\u0440\u0435\u0437 CustomAction).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0430\u0439\u0442\u043e\u0432 \u043d\u0430 IIS (\u0447\u0435\u0440\u0435\u0437 CustomAction).<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0411\u0414 (\u0434\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f Fluent Migrator) \u043f\u0443\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 t-sql (\u0447\u0435\u0440\u0435\u0437 CustomAction).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0411\u0414 (\u043d\u0430 \u0444\u043e\u0440\u043c\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c RabbitMQ (\u043d\u0430 \u0444\u043e\u0440\u043c\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0430\u0439\u0442\u043e\u0432 \u0438 \u0438\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 IIS (\u043d\u0430 \u0444\u043e\u0440\u043c\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (\u043d\u0430 \u0444\u043e\u0440\u043c\u0435).<\/p>\n<\/li>\n<\/ul>\n<h3>\u0410 \u043a\u0430\u043a \u0436\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435?<\/h3>\n<p>\u0414\u0430. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a \u0434\u043b\u044f \u043d\u0430\u0441 \u0438 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u043e\u0432 \u0441\u0442\u0430\u043b \u0431\u044b \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u044b\u043c.<\/p>\n<p>\u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0447\u0435\u0440\u0435\u0437 msi \u0438 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 major upgrade. \u041d\u0430\u043c \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0430\u0442\u0447\u0438. \u041d\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0438\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u041f\u041e \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>Wix# \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u043e, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0432\u043e\u0438\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.<\/p>\n<p>\u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u0432 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u0430 \u0441\u0432\u044f\u0437\u044c \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439. \u042d\u0442\u043e \u0434\u0430\u043b\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0440\u0430\u043d\u0435\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0445 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430, \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 InnoSetup \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u043b\u0438\u0441\u044c msi \u043a\u0430\u043a \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u043e\u0434\u0443\u043a\u0442).<\/p>\n<p>\u0418 \u0437\u0430\u0449\u0438\u0442\u0438\u043b\u0438 \u0411\u0414 \u043e\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h3>\u041a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043b\u0430\u043d\u044b \u043f\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430?<\/h3>\n<ul>\n<li>\n<p>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 RabbitMQ.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 IIS,  \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u043d\u0430 Python.<\/p>\n<\/li>\n<li>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c Modify \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 msi (\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u043d\u0435\u0435 \u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f).<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c UI c WinForms \u043d\u0430 WPF.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0438 \u0436\u0434\u0435\u043c \u0432\u0430\u0448\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/crosstech\/blog\/543032\/\"> https:\/\/habr.com\/ru\/company\/crosstech\/blog\/543032\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text_v2\" id=\"post-content-body\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0430\u043b\u043e\u043c\u0430\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u044c\u044e\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u0438 \u0442\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0439\u043c\u0443 \u0432\u0441\u0435\u0433\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0432 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0443 \u044d\u0442\u0430\u043f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0412 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0432\u043e\u0435\u0439 \u0440\u0435\u0438\u043d\u043a\u0430\u0440\u043d\u0430\u0446\u0438\u0438 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0440\u0433\u0430\u043b\u0438 \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430 \u0438 \u0432\u0441\u0435 \u044d\u0442\u043e \u043f\u043e\u0434\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u0434 \u0441\u043e\u0443\u0441\u043e\u043c InnoSetup. \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u043c. \u0418 \u043c\u044b \u043f\u0440\u0438\u0448\u043b\u0438 \u043a \u0440\u0435\u0448\u0435\u043d\u0438\u044e \u043f\u0435\u0440\u0435\u0441\u0435\u0441\u0442\u044c \u043d\u0430 &#171;\u043d\u043e\u0432\u044b\u0435 \u0440\u0435\u043b\u044c\u0441\u044b&#187; \u0438 \u0442\u0443\u0442 \u043f\u043e\u043d\u0435\u0441\u043b\u043e\u0441\u044c\u2026<\/p>\n<h3>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Wix, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438 WixSharp<\/h3>\n<p>\u0412\u044b\u0431\u043e\u0440 \u043f\u0430\u043b \u043d\u0430 Wix. \u041d\u043e \u0436\u0435\u043b\u0430\u044e\u0449\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u044c xml \u0441\u043a\u0440\u0438\u043f\u0442\u044b Wix \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043d\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c. \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442 \u043e\u0442\u0434\u0430\u0432\u0430\u043b\u0438 C#. \u0418, \u0443\u0440\u0430, \u0431\u044b\u043b \u0437\u0430\u043c\u0435\u0447\u0435\u043d \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 Wix# (WixSharp). <\/p>\n<p>\u041f\u043e Wix# \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u0432 \u0441\u0435\u0442\u0438 \u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0412 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0430\u0432\u0442\u043e\u0440\u044b \u043f\u044b\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043d\u0435\u0441\u0442\u0438 \u0441\u0432\u043e\u0439 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u043f\u044b\u0442 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f\u043c \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0439 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c \u0441 \u0432\u0430\u043c\u0438.<\/p>\n<p>Wix# \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f msi. \u0422\u0430\u043a\u0436\u0435, \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u043f\u0443\u0442\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f wix \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0439 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439 Wix. \u041f\u0440\u0438\u044f\u0442\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u0442\u044c WPF. \u041e\u0434\u043d\u0430\u043a\u043e \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0444\u043e\u0440\u043c\u044b \u043d\u0430 WinForm. \u0418 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u043c\u044b \u0432\u044b\u044f\u0432\u0438\u043b\u0438 \u0440\u044f\u0434 \u0432\u0430\u0436\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u0440\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u043d\u0438\u0436\u0435.<\/p>\n<h3>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinForm<\/h3>\n<p>\u041f\u0440\u0438 \u043f\u0440\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u043e\u0440\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 \u043c\u044b \u043f\u043e\u043d\u044f\u043b\u0438, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u043d\u0435 \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043a\u0430\u0436\u0434\u0430\u044f \u0444\u043e\u0440\u043c\u0430 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0430 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0441 \u0443\u0447\u0435\u0442\u043e\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430\u0445 \u0444\u043e\u0440\u043c \u0432 msi.<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0444\u043e\u0440\u043c\u044b<\/figcaption><\/figure>\n<\/div>\n<\/details>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043f\u043e \u0444\u043e\u0440\u043c\u0430\u043c \u043c\u044b \u0441\u043c\u043e\u0433\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043c\u0435\u043d\u0435\u0435 \u0440\u0430\u0441\u043a\u0438\u0434\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b. \u0418 \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0449\u0435 \u043f\u0430\u0440\u0443-\u0442\u0440\u043e\u0439\u043a\u0443 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0440\u043c. \u041d\u043e&#8230;<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0431\u0440\u043e\u0441\u0430\u0442\u044c\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043d\u043e\u0432\u044b\u0445 \u0444\u043e\u0440\u043c, \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0431\u044b\u043b\u0430 \u0441 &#171;\u0437\u0430\u043f\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c&#187;. \u041d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u043e\u0441\u044c \u043c\u0435\u0440\u0446\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043e\u0442 \u043e\u0434\u043d\u043e\u0439 \u043a \u0434\u0440\u0443\u0433\u043e\u0439. \u041f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u044d\u0442\u043e \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u043d\u043a\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043e\u0432 \u0432\u043e \u0432\u043d\u043e\u0432\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0444\u043e\u0440\u043c\u0435 \u043f\u043e\u0434 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430. \u0412 \u044d\u0442\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WinForm msi.<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u0410 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c UI \u043d\u0430 WPF.<\/p>\n<h3>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c<\/h3>\n<p>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043c\u043e\u0434\u0443\u043b\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 Wix# \u043e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u043c\u043e\u0434\u0443\u043b\u044c, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0446\u0438\u0439. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">var binaries = new Feature(\"Binaries\", \"Product binaries\", true, false); var docs = new Feature(\"Documentation\", \"Product documentation (manuals and user guides)\", true); var tuts = new Feature(\"Tutorials\", \"Product tutorials\", false); docs.Children.Add(tuts);  var project = \tnew ManagedProject(\"ManagedSetup\", \t\tnew Dir(@\"%ProgramFiles%\\My Company\\My Product\", \t\t\tnew File(binaries, @\"Files\\bin\\MyApp.exe\"), \t\t\tnew Dir(\"Docs\", \t\t\t\tnew File(docs, \"readme.txt\"), \t\t\t\tnew File(tuts, \"setup.cs\"))));   project.Binaries = new[] { \tnew Binary(new Id(\"EchoBin\"), @\"Files\\Echo.exe\") };  project.Actions = new WixSharp.Action[] { \tnew InstalledFileAction(\"registrator_exe\", \"\/u\", Return.check, When.Before, Step.InstallFinalize, Condition.Installed), \tnew InstalledFileAction(\"registrator_exe\", \"\", Return.check, When.After, Step.InstallFinalize, Condition.NOT_Installed), \tnew PathFileAction(@\"%WindowsFolder%\\notepad.exe\", @\"C:\\boot.ini\", \"INSTALLDIR\", Return.asyncNoWait, When.After, Step.PreviousAction, Condition.NOT_Installed), \tnew ScriptAction(@\"MsgBox \"\"Executing VBScript code...\"\"\", Return.ignore, When.After, Step.PreviousAction, Condition.NOT_Installed), \tnew ScriptFileAction(@\"Files\\Sample.vbs\", \"Execute\" , Return.ignore, When.After, Step.PreviousAction, \"NOT Installed\"), \tnew BinaryFileAction(\"EchoBin\", \"Executing Binary file...\", Return.check, When.After, Step.InstallFiles, Condition.NOT_Installed) \t{ \t\tExecute = Execute.deferred \t} }; \t project.Properties = new[] { \t\tnew Property(\"Gritting\", \"Hello World!\"), \t\tnew Property(\"Title\", \"Properties Test\"), \t\tnew PublicProperty(\"NOTEPAD_FILE\", @\"C:\\boot.ini\") } \t project.GUID = new Guid(\"6f330b47-2577-43ad-9095-1861ba25889b\"); project.ManagedUI = ManagedUI.Default; project.UIInitialized += Project_UIInitialized; project.Load += msi_Load; project.AfterInstall += msi_AfterInstall;<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0412 \u0441\u0432\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043f\u0446\u0438\u0439 \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0440\u0430\u0437\u043d\u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u043e\u043f\u0446\u0438\u0438 \u043f\u043e \u043c\u043e\u0434\u0443\u043b\u044f\u043c \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u044b\u0439 \u0432\u0438\u0434:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">var project = new ManagedProject(ProjectConstants.PROJECT_NAME) { \tGUID = new Guid(ProjectConstants.PROJECT_GUID), \tPlatform = Platform.x64, \tUpgradeCode = new Guid(ProjectConstants.PROJECT_GUID), \tInstallScope = InstallScope.perMachine, \tDescription = ProjectConstants.COMPANY_NAME, \tLanguage = \"ru-RU\", \tLocalizationFile = @\"WixUI_ru-ru.wxl\", \tControlPanelInfo = productInfo, \tMajorUpgradeStrategy = upgradeStrategy, \tMajorUpgrade = majorUpgrade, \tDefaultRefAssemblies = RefAssembliesGenerator.InitializeRefAssemblies(), \tGenericItems = GenericEntitiesGenerator.InitializeGenericEntities(), \tProperties = PropertiesGenerator.InitializeProperties(), \tDirs = DirsGenerator.InitializeDirs(), \tBinaries = BinariesGenerator.InitializeBinaries(), \tActions = ActionsGenerator.InitializeActions(), \tManagedUI = new ManagedUI(), \tReinstallMode = \"amus\" };<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 msi<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043c\u044b \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u044a\u044f\u0432\u0438\u0442\u044c \u043d\u0435 \u043e\u0434\u0438\u043d \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432 (Property), \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u043e\u0434\u043e\u0431\u043d\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c, \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u0435\u0441\u0442\u0430\u0445 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043a\u0430\u043a \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438, \u0442\u0430\u043a \u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Custom Action. <\/p>\n<p>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0438\u0445 \u0438\u043c\u0435\u043d\u0438 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u0432\u0438\u0434\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0431\u044a\u044f\u0432\u0438\u0432 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>new Property(\"Gritting\", \"Hello World!\")<\/code> \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0434\u0430\u043b\u0435\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043a \u044d\u0442\u043e\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0443 \u0434\u043e\u0441\u0442\u0443\u043f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430, \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a <code>Runtime.Session[\"Gritting \"]<\/code><\/p>\n<p>\u0422\u0430\u043a\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e \u043e\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043f\u043e\u043c\u043d\u0438\u0442\u044c, \u043a\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u0436\u043d\u043e\u0435 \u0435\u043c\u0443 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043e\u0448\u0438\u0431\u043a\u0430 \u0431\u044b\u043b\u0430 \u0431\u044b \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 runtime \u0438 \u043f\u0440\u0438 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u043a\u043e\u0434\u0430, \u0433\u0434\u0435 \u0431\u044b\u043b\u0430 \u0434\u043e\u043f\u0443\u0449\u0435\u043d\u0430 \u043e\u043f\u0435\u0447\u0430\u0442\u043a\u0430.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 enum \u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0447\u0442\u0435\u043d\u0438\u0435\u043c \u0438 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u044d\u0442\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432. \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u0441\u0442\u0430\u043b\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public enum eProperties {  \t[Value(\"Hello World!\"))]  \tGRITTING,  \t[Value(\"Properties Test \"))]  \tTITLE,  \t\/\/ \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0432\u043e\u0439\u0441\u0442\u0432 }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0410 \u0441\u0430\u043c\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 enum \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public static class PropertiesGenerator { \tprivate static Property InizializeProperty(string propertyName, string propertyValue) \t{ \t\treturn new Property(new Id(propertyName), propertyName, propertyValue) { IsDeferred = true }; \t}  \tprivate static IList&lt;T&gt; ToTypedList&lt;T&gt;(Type entityType, Func&lt;Enum, T&gt; createFunc) \t{ \t\tif (createFunc != null \t\t\t&amp;&amp; entityType.IsEnum) \t\t{ \t\t\treturn Enum.GetValues(entityType) \t\t\t\t.Cast&lt;Enum&gt;() \t\t\t\t.Select(createFunc) \t\t\t\t.ToList(); \t\t} \t\treturn null; \t}  \tpublic static Property[] InitializeProperties() \t{ \t\treturn ToTypedList(typeof(eProperties), \t\t\te =&gt; InizializeProperty(e.ToString(), e.GetPropertyValue())) \t\t\t.ToArray(); \t} }<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c \u0438\u0437 \u0434\u0438\u0430\u043b\u043e\u0433\u0430 \u0442\u043e\u0436\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u041d\u0430 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043b\u043e <code>this.GetData(GRITTING)<\/code>, \u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c<code>&nbsp;this.SetData(GRITTING, \u201cNew value\u201d)<\/code>, \u0433\u0434\u0435 GetData() \u0438 SetData() \u043c\u0435\u0442\u043e\u0434\u044b \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 ManagedForm.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u0438\u0437 Custom Action \u0441\u0442\u0430\u043b\u043e <code>session.Data(GRITTING)<\/code><\/p>\n<h3>MSI \u043d\u0443\u0436\u043d\u044b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438<\/h3>\n<p>\u0412 \u0445\u043e\u0434\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0430\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u043e\u043c \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0421\u0423\u0411\u0414 Postgre). \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b\u0438 \u0432\u0441\u0435 \u0440\u0443\u0447\u043a\u0430\u043c\u0438, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Wix#:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">project.DefaultRefAssemblies.Add(\"FontAwesome.Sharp.dll\"); project.DefaultRefAssemblies.Add(\"Newtonsoft.Json.dll\"); project.DefaultRefAssemblies.Add(\"ManagedOpenSsl.dll\");<\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0441\u0442\u0430\u043b\u043e \u0432\u043e\u0437\u0440\u0430\u0441\u0442\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043c\u044b \u0440\u0435\u0448\u0438\u043b\u0438 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u0447\u0435\u0447\u043d\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 dll  \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static List&lt;string&gt; GetResourceList(string resourcesDirPath) =&gt; \tDirectory.GetFiles($@\"{resourcesDirPath}\\\") \t\t.Where(file =&gt; file.EndsWith(\"dll\")) \t\t.ToList();  public static List&lt;string&gt; InitializeRefAssemblies() =&gt; \tGetResourceList(Application.StartupPath) \t\t.Concat(GetResourceList(\"Resources\")) \t\t.ToList();<\/code><\/pre>\n<\/div>\n<\/details>\n<h3>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432<\/h3>\n<p>C \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0431\u043e\u043b\u0435\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u0435\u0435, \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u0435\u0440\u0430\u0440\u0445\u0438\u044e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0432 \u043d\u0438\u0445 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0438, \u043f\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438, \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c \u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">private static bool ServicePredicate(string file) =&gt; !file.EndsWith(\".pdb\");  private static IEnumerable&lt;WixEntity&gt; InitializeDirWixEntities(object dirName) { \tvar items = new List&lt;WixEntity&gt;(); \titems.AddRange(new List&lt;WixEntity&gt; \t{ \t\tnew Dir(\"logs\"), \t\tnew DirFiles($@\"Sources\\{dirName}\\*.*\", ServicePredicate) \t}); \treturn new[] { new Dir(dirName.ToString(), items.ToArray()) }; }  private static WixEntity[] InilizeDirItems() =&gt; \tnew List&lt;WixEntity&gt;() \t\t.Concat(InitializeDirWixEntities(FirstService)) \t\t.Concat(InitializeDirWixEntities(SecondService)) \t\t.Concat(InitializeDirWixEntities(ThirdService)) \t\t.Concat(InitializeDirWixEntities(FourthService)) \t\t.ToArray();  public static Dir[] InitializeDirs() =&gt; \tnew[] \t{ \t\tnew Dir(@\"%ProgramFiles%\\CompanyName\\\", \t\t\tnew Dir(\"distr\", \t\t\t\tnew Dir(FluentMigrator, GetMigratorFileList(\"FluentMigrator\")), \t\t\t\t), \t\t\tnew Dir(\"app\", InilizeDirItems()) \t\t) \t};  <\/code><\/pre>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<h3>\u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0441\u0430\u0439\u0442\u043e\u0432 \u043d\u0430 IIS<\/h3>\n<p>\u041e\u0434\u043d\u0430 \u0438\u0437 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0449\u0438\u043a\u0430 &#8212; \u044d\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0430\u0439\u0442\u043e\u0432\/\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 IIS, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f https \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 ssl. \u0418\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 Wix# \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0443\u043c\u0435\u043b (\u0434\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 1.14.3). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c Wix, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 WixExtension.Iis.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 Wix \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0430\u0439\u0442\u0430 \u043d\u0430 IIS:<\/p>\n<details class=\"spoiler\">\n<summary><\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">public abstract class IISWebSite: WixEntity, IGenericEntity { \t[Xml] \tpublic string Condition;  \t[Xml] \tpublic string Description;  \t[Xml] \tpublic<\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-318933","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318933","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=318933"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/318933\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=318933"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=318933"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=318933"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}