Мужики, у меня проблемка — для вас задачка Помогите, плиз, хотя бы с "куда копать".
Пишу свой "веслосипед" — ASP.NET; Практически всё написал в 230 строчек кода!
Где затык: сам ASP-движок сделан в виде SCGI-сервера позади nginx. Движок принимает скрипт, компилирует в ассеммблю В ПАМЯТИ и запускает "генератор HTML страницы" (метод из класса).
Но если при компиляции я задал все referenced сборки (из разных мест) и всё прошло на ура, то запуск метода из этой ассембли мгновенно падает "не могу найти зареференсеные сборки"!
Как же так? Ведь сборка уже в памяти и должна знать, где лежат DLLки! ProcessMonitor'ом подсмотрено, что ассембля ищет свои сборки исключительно в каталоге, где лежит экзешник самого ASP-движка! И когда я руками скопировал недостающие либы, всё заработало.
Но я не могу к движку в каталог копировать все сторонние DLLки! Ведь ASP-страницы могут быть вообще от разных приложений.
Как быть?
Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.
UPD
Запилил поддержку бинарного вывода. Да вообще любого, просто установи "Content-type"!
● OUT_BINARY ●
● HTTP_CONTENT_TYPE image/jpeg ●
● assembly System.Drawing.dll ●
● import System.Drawing ●
● import System.Drawing.Imaging ●
● import System.Drawing.Drawing2D ●
This text should be ignored by engine
■
// SafeStringHash _hdr, byte[] _body, SafeStringHash _qry
int height = 100;
int width = 200;
using var bmp = new Bitmap(width, height, PixelFormat.Format24bppRgb);
using var g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.Clear(Color.Azure);
g.RotateTransform(20);
g.DrawString("123", new Font("Classic Robot", 24, FontStyle.Bold), SystemBrushes.WindowText, 10, 10);
g.RotateTransform(-40);
g.DrawString(_qry["text"], new Font("Izhitsa", 24, FontStyle.Bold), SystemBrushes.WindowText, 40, 90);
bmp.Save(_memStrm, ImageFormat.Jpeg);
■
Здравствуйте, Baiker, Вы писали:
B>Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.
Вы же хотите переизобрести то, за что ненавидят PHP — мешанину из кода и HTML-разметки
Здравствуйте, Baiker, Вы писали:
B>Мужики, у меня проблемка — для вас задачка Помогите, плиз, хотя бы с "куда копать".
B>Пишу свой "веслосипед" — ASP.NET; Практически всё написал в 170 строчек кода! B>Где затык: сам ASP-движок сделан в виде SCGI-сервера позади nginx. Движок принимает скрипт, компилирует в ассеммблю В ПАМЯТИ и запускает "генератор HTML страницы" (метод из класса). B>Но если при компиляции я задал все referenced сборки (из разных мест) и всё прошло на ура, то запуск метода из этой ассембли мгновенно падает "не могу найти зареференсеные сборки"! B>Как же так? Ведь сборка уже в памяти и должна знать, где лежат DLLки! ProcessMonitor'ом подсмотрено, что ассембля ищет свои сборки исключительно в каталоге, где лежит экзешник самого ASP-движка! И когда я руками скопировал недостающие либы, всё заработало. B>Но я не могу к движку в каталог копировать все сторонние DLLки! Ведь ASP-страницы могут быть вообще от разных приложений. B>Как быть?
Собирай на диске и запускай с диска, под каждую сборку свой каталог.
Здравствуйте, Shmj, Вы писали:
S>Возможно понимание этого примера поможет вам: creating-app-with-plugin-support
Не понял связи... ну сделаю я плагин. Сборки кто искать будет?? Да и какая разница, плагин-шмагин. Есть страница, скомпиленая в DLL. Страница вежливо указывает пути сборок. Прикол в том, что страница исполняется в контексте текущего EXE и сборке надо как-то подсунуть пути поиска других DLL. Или как-то при формировании сборки в памями сказать системе "загрузи зависимые библиотеки, вот я тебе ж пути давал!"
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, Baiker, Вы писали:
B>>Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.
S>Вы же хотите переизобрести то, за что ненавидят PHP — мешанину из кода и HTML-разметки
Во-первых, PHP ненавидят за ублюдский язык, а не "мешанину", а во-вторых, "мешанина" ничем не плоха (как и goto) — плохи те, кто не умеет с этим обращаться.
Если у тебя есть ЛЮБОЙ я/п и тебе нужна на выходе HTML-страничка, ты тем или иным образом всё равно погружаешься в теги, мешанину и т.п. А как иначе?? Выход — зафиксирован. Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.
Здравствуйте, vaa, Вы писали:
vaa>Собирай на диске и запускай с диска, под каждую сборку свой каталог.
Ну вот разве что так! Тем более, что "втихаря" C# всё равно гадит на диск, а потом выдаёт сборочку "типа в памяти"! Неужели за 20 лет MS не научилась компилировать без файлов??
Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL — там просто "абракадабра версии 0.0.0.0". Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).
Короче, опять вместо проблемы бизнес-кода решаем, как объезжать костыли MS.
B>Не понял связи... ну сделаю я плагин. Сборки кто искать будет?? Да и какая разница, плагин-шмагин. Есть страница, скомпиленая в DLL. Страница вежливо указывает пути сборок. Прикол в том, что страница исполняется в контексте текущего EXE и сборке надо как-то подсунуть пути поиска других DLL. Или как-то при формировании сборки в памями сказать системе "загрузи зависимые библиотеки, вот я тебе ж пути давал!"
Это как раз пример как подсунуть — см. класс AssemblyDependencyResolver
Здравствуйте, Baiker, Вы писали:
B>Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL — там просто "абракадабра версии 0.0.0.0". Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).
Для этого есть концепция AppDomain, а начиная с .NET Core её переформатировали в AssemblyLoadContext. Используя эти механизмы сборки можно загружать изолировано друг от друга так, чтобы они не мешали друг дружке даже когда что-то там в наборе зависимостей совпадает.
Но это всё требует умения, нахрапом заставить это работать как надо довольно трудно, но стоит отметить, что решение такой задачи возможно всегда.
Здравствуйте, Baiker, Вы писали:
B>Ну вот разве что так! Тем более, что "втихаря" C# всё равно гадит на диск, а потом выдаёт сборочку "типа в памяти"! Неужели за 20 лет MS не научилась компилировать без файлов??
Научилась. И даже нормальный ASP.NET давно уже научился Розлин использовать.
B>Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL
Для этого надо свое "приложение" запускать в отдельном домене. А если совсем по нормальному, то в отдельном процессе.
B>Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).
Ну так ты сам опеределись сперва, что тебе в этом случае делать. Можно обе версии загрузить, можно всегда подсовывать самую свежую в пределах запрошенной major. А как определишься — что делать сразу станет понятно.
B>Короче, опять вместо проблемы бизнес-кода решаем, как объезжать костыли MS.
Здравствуйте, Baiker, Вы писали:
B>Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.
Поэтому нормальные люди разделяют логику и представление. А наивные любители макарон всегда были — вспомните хоть ColdFusion, хоть CGI-скрипты. Почему-то ни одна из них не дожила до наших дней (потому что наивные любители умнели, а пришедшие им на смену — изобретали новые макароны, welcome to the club!).
Здравствуйте, Mr.Delphist, Вы писали:
MD>Здравствуйте, Baiker, Вы писали:
B>>Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.
MD>Поэтому нормальные люди разделяют логику и представление.
Не понимаю этот якобы умный выпад. А что, с ASP нельзя разделить логику??