Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 02:19
Оценка:
Мужики, у меня проблемка — для вас задачка Помогите, плиз, хотя бы с "куда копать".

Пишу свой "веслосипед" — ASP.NET; Практически всё написал в 230 строчек кода!
Где затык: сам ASP-движок сделан в виде SCGI-сервера позади nginx. Движок принимает скрипт, компилирует в ассеммблю В ПАМЯТИ и запускает "генератор HTML страницы" (метод из класса).
Но если при компиляции я задал все referenced сборки (из разных мест) и всё прошло на ура, то запуск метода из этой ассембли мгновенно падает "не могу найти зареференсеные сборки"!
Как же так? Ведь сборка уже в памяти и должна знать, где лежат DLLки! ProcessMonitor'ом подсмотрено, что ассембля ищет свои сборки исключительно в каталоге, где лежит экзешник самого ASP-движка! И когда я руками скопировал недостающие либы, всё заработало.
Но я не могу к движку в каталог копировать все сторонние DLLки! Ведь ASP-страницы могут быть вообще от разных приложений.
Как быть?
Отредактировано 20.10.2022 18:38 Baiker . Предыдущая версия . Еще …
Отредактировано 13.10.2022 2:21 Baiker . Предыдущая версия .
Re: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 02:28
Оценка:
Кому интересно поржать, страницы выглядят так:

● assembly System.dll ●
● assembly System.Data.dll ●
● assembly c:\DEV\ExtLibs\Dapper.dll ●
● assembly c:\DEV\ExtLibs\Dapper.Contrib.dll ●

● import System.Linq ●
● import Dapper ●
● import Dapper.Contrib.Extensions●
● import System.Data.SqlClient ●

<html>
<body>

■
var conn = new SqlConnection("server=.;database=БАЗА;trusted_connection=true");//! MS SQL
conn.Open();
var lst = conn.GetAll<SomeClass>().ToList();
■

Recs: ♦ lst.Count ♦

<table border=1>
■
foreach(var rec in lst) {■
    <tr><td>♦ rec.ID ♦<td>♦ rec.Code ♦<td>♦ rec.Title ♦
■
}
conn.Close();
■
</table>
</body>
</html>


Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.

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);
■
Отредактировано 20.10.2022 18:34 Baiker . Предыдущая версия .
Re: Ассембля в памяти не находит ref.DLLки
От: Shmj Ниоткуда  
Дата: 13.10.22 04:28
Оценка:
Здравствуйте, Baiker, Вы писали:

B>Как быть?


Возможно понимание этого примера поможет вам: https://learn.microsoft.com/en-us/dotnet/core/tutorials/creating-app-with-plugin-support
Re[2]: Ассембля в памяти не находит ref.DLLки
От: Shmj Ниоткуда  
Дата: 13.10.22 04:29
Оценка: 1 (1)
Здравствуйте, Baiker, Вы писали:

B>Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.


Вы же хотите переизобрести то, за что ненавидят PHP — мешанину из кода и HTML-разметки
Re: Ассембля в памяти не находит ref.DLLки
От: vaa  
Дата: 13.10.22 04:49
Оценка:
Здравствуйте, Baiker, Вы писали:

B>Мужики, у меня проблемка — для вас задачка Помогите, плиз, хотя бы с "куда копать".


B>Пишу свой "веслосипед" — ASP.NET; Практически всё написал в 170 строчек кода!

B>Где затык: сам ASP-движок сделан в виде SCGI-сервера позади nginx. Движок принимает скрипт, компилирует в ассеммблю В ПАМЯТИ и запускает "генератор HTML страницы" (метод из класса).
B>Но если при компиляции я задал все referenced сборки (из разных мест) и всё прошло на ура, то запуск метода из этой ассембли мгновенно падает "не могу найти зареференсеные сборки"!
B>Как же так? Ведь сборка уже в памяти и должна знать, где лежат DLLки! ProcessMonitor'ом подсмотрено, что ассембля ищет свои сборки исключительно в каталоге, где лежит экзешник самого ASP-движка! И когда я руками скопировал недостающие либы, всё заработало.
B>Но я не могу к движку в каталог копировать все сторонние DLLки! Ведь ASP-страницы могут быть вообще от разных приложений.
B>Как быть?

Собирай на диске и запускай с диска, под каждую сборку свой каталог.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 09:15
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Возможно понимание этого примера поможет вам: creating-app-with-plugin-support


Не понял связи... ну сделаю я плагин. Сборки кто искать будет?? Да и какая разница, плагин-шмагин. Есть страница, скомпиленая в DLL. Страница вежливо указывает пути сборок. Прикол в том, что страница исполняется в контексте текущего EXE и сборке надо как-то подсунуть пути поиска других DLL. Или как-то при формировании сборки в памями сказать системе "загрузи зависимые библиотеки, вот я тебе ж пути давал!"
Re[3]: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 09:20
Оценка: 1 (1)
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Baiker, Вы писали:


B>>Между кружочков — директивы, меж квадратов — код, меж ромбов — "выведи значение переменной". Да, выглядит необычно, зато ярко, легко выделяется в коде.


S>Вы же хотите переизобрести то, за что ненавидят PHP — мешанину из кода и HTML-разметки


Во-первых, PHP ненавидят за ублюдский язык, а не "мешанину", а во-вторых, "мешанина" ничем не плоха (как и goto) — плохи те, кто не умеет с этим обращаться.
Если у тебя есть ЛЮБОЙ я/п и тебе нужна на выходе HTML-страничка, ты тем или иным образом всё равно погружаешься в теги, мешанину и т.п. А как иначе?? Выход — зафиксирован. Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.
Отредактировано 13.10.2022 10:46 Baiker . Предыдущая версия .
Re[2]: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 09:25
Оценка: +1
Здравствуйте, vaa, Вы писали:

vaa>Собирай на диске и запускай с диска, под каждую сборку свой каталог.


Ну вот разве что так! Тем более, что "втихаря" C# всё равно гадит на диск, а потом выдаёт сборочку "типа в памяти"! Неужели за 20 лет MS не научилась компилировать без файлов??

Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL — там просто "абракадабра версии 0.0.0.0". Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).

Короче, опять вместо проблемы бизнес-кода решаем, как объезжать костыли MS.
Re[3]: Ассембля в памяти не находит ref.DLLки
От: Shmj Ниоткуда  
Дата: 13.10.22 09:28
Оценка: 2 (1)
Здравствуйте, Baiker, Вы писали:


B>Не понял связи... ну сделаю я плагин. Сборки кто искать будет?? Да и какая разница, плагин-шмагин. Есть страница, скомпиленая в DLL. Страница вежливо указывает пути сборок. Прикол в том, что страница исполняется в контексте текущего EXE и сборке надо как-то подсунуть пути поиска других DLL. Или как-то при формировании сборки в памями сказать системе "загрузи зависимые библиотеки, вот я тебе ж пути давал!"


Это как раз пример как подсунуть — см. класс AssemblyDependencyResolver
Re[4]: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 13.10.22 10:45
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это как раз пример как подсунуть — см. класс AssemblyDependencyResolver


А! Всё, понял. Спасибо, но это про Core. Федорино Коре. У меня FW 4.8;

UPD
Судя по сорсам, это просто тупой перебор файлов в предефайненых каталогах. Такой примитив я и сам сделаю.
Отредактировано 13.10.2022 11:15 Baiker . Предыдущая версия .
Re: Ассембля в памяти не находит ref.DLLки
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.10.22 13:37
Оценка: -1
Здравствуйте, Baiker, Вы писали:

http://rsdn.org/forum/dotnet/8183098.flat
Автор: Serginio1
Дата: 28.01.22
и солнце б утром не вставало, когда бы не было меня
Re[3]: Ассембля в памяти не находит ref.DLLки
От: Aquilaware  
Дата: 13.10.22 14:57
Оценка: 6 (1)
Здравствуйте, Baiker, Вы писали:

B>Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL — там просто "абракадабра версии 0.0.0.0". Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).


Для этого есть концепция AppDomain, а начиная с .NET Core её переформатировали в AssemblyLoadContext. Используя эти механизмы сборки можно загружать изолировано друг от друга так, чтобы они не мешали друг дружке даже когда что-то там в наборе зависимостей совпадает.

Но это всё требует умения, нахрапом заставить это работать как надо довольно трудно, но стоит отметить, что решение такой задачи возможно всегда.
Re[5]: Ассембля в памяти не находит ref.DLLки
От: Ночной Смотрящий Россия  
Дата: 14.10.22 16:32
Оценка:
Здравствуйте, Baiker, Вы писали:

B>А! Всё, понял. Спасибо, но это про Core.


Для FW — https://learn.microsoft.com/en-us/dotnet/api/system.appdomain.assemblyresolve?view=netframework-4.8
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Ассембля в памяти не находит ref.DLLки
От: Ночной Смотрящий Россия  
Дата: 14.10.22 16:47
Оценка: +1
Здравствуйте, Baiker, Вы писали:

B>Ну вот разве что так! Тем более, что "втихаря" C# всё равно гадит на диск, а потом выдаёт сборочку "типа в памяти"! Неужели за 20 лет MS не научилась компилировать без файлов??


Научилась. И даже нормальный ASP.NET давно уже научился Розлин использовать.

B>Я позже применил другой хак: AppDomain.CurrentDomain.AssemblyResolve , но беда в том, что я не знаю, какое приложение запросило DLL


Для этого надо свое "приложение" запускать в отдельном домене. А если совсем по нормальному, то в отдельном процессе.

B>Т.е. есть риск, что два приложения запросят одну DLL, но разных версий (такое как раз и бывает на тестовых серверах).


Ну так ты сам опеределись сперва, что тебе в этом случае делать. Можно обе версии загрузить, можно всегда подсовывать самую свежую в пределах запрошенной major. А как определишься — что делать сразу станет понятно.

B>Короче, опять вместо проблемы бизнес-кода решаем, как объезжать костыли MS.


Продолжай.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Ассембля в памяти не находит ref.DLLки
От: Ночной Смотрящий Россия  
Дата: 14.10.22 16:47
Оценка:
Здравствуйте, Aquilaware, Вы писали:

A>Для этого есть концепция AppDomain, а начиная с .NET Core её переформатировали в AssemblyLoadContext.


Нет, ее переформатировали в запуск отдельного процесса.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Ассембля в памяти не находит ref.DLLки
От: Mr.Delphist  
Дата: 21.10.22 07:37
Оценка: -1
Здравствуйте, Baiker, Вы писали:

B>Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.


Поэтому нормальные люди разделяют логику и представление. А наивные любители макарон всегда были — вспомните хоть ColdFusion, хоть CGI-скрипты. Почему-то ни одна из них не дожила до наших дней (потому что наивные любители умнели, а пришедшие им на смену — изобретали новые макароны, welcome to the club!).
Re[5]: Ассембля в памяти не находит ref.DLLки
От: Baiker  
Дата: 21.10.22 09:19
Оценка:
Здравствуйте, Mr.Delphist, Вы писали:

MD>Здравствуйте, Baiker, Вы писали:


B>>Именно поэтому изобретай ты хоть Лазер, хоть Блазер, один хрен будешь канаёпиться с HTML.


MD>Поэтому нормальные люди разделяют логику и представление.


Не понимаю этот якобы умный выпад. А что, с ASP нельзя разделить логику??
Re[6]: Ассембля в памяти не находит ref.DLLки
От: Mr.Delphist  
Дата: 22.10.22 19:12
Оценка: +1
Здравствуйте, Baiker, Вы писали:

B>Не понимаю этот якобы умный выпад. А что, с ASP нельзя разделить логику??


Речь про это месиво https://rsdn.org/forum/dotnet/8382371.1
Автор: Baiker
Дата: 13.10.22
Re[7]: Ассембля в памяти не находит ref.DLLки
От: Sinclair Россия https://github.com/evilguest/
Дата: 23.10.22 12:46
Оценка: +1
Здравствуйте, Mr.Delphist, Вы писали:

MD>Речь про это месиво https://rsdn.org/forum/dotnet/8382371.1
Автор: Baiker
Дата: 13.10.22

Ну так это же 1-в-1 ASP. Тот самый, который на VB, а не ASP.Net.
Я как вот это увидел — аж всплакнул:
var conn = new SqlConnection("server=.;database=БАЗА;trusted_connection=true");//! MS SQL
conn.Open();
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.