Как программно загрузить *.resource.dll из GAS?
От: mDmitriy Россия  
Дата: 13.09.24 15:29
Оценка:
Всем привет!

Есть проект .Net Framework 4.8, WinForm

Как известно, при первой загрузке форма загружается дольше чем при всех последующих вызовах, что связано в подгрузкой разных ресурсов в кеш.
Когда разница во времени между первым вызовом и последующими становится дискомфортной, появляется задача первый вызов ускорить.
Самый простой способ — загрузить требуемые формой dll в фоновом потоке при старте программы.
Для обычных dll это просто, а вот как загрузить ресурсную dll?

В моем случае форма при первом вызове загружает "System.ServiceModel.resource.dll" (идет вызов WCF), что вызывает заметное глазу торможение.
Где конкретно происходит ее вызов и кто ее вызывает — установить не удалось (видимо таки из System.ServiceModel.dll, но это не точно).

Я знаю, что можно загрузить dll классическим методом:
public static System.Reflection.Assembly Load (System.Reflection.AssemblyName assemblyRef)

Ро где взять AssemblyName (System.ServiceModel.resources, Version=4.0.0.0, Culture=ru, PublicKeyToken=b77a5c561934e089)?
Законопачивать эту строчку в код не хочется, потом не оберешься проблем.

Любые идеи приветствуются

PS. Предварительный вызов пустого метода WCF в том же фоновом потоке, наверно, решит проблему (хотя и только для этой dll), но уж слишком извратно
Отредактировано 13.09.2024 15:29 mDmitriy . Предыдущая версия .
Re: Как программно загрузить *.resource.dll из GAS?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 14.09.24 12:43
Оценка: 88 (2)
Здравствуйте, mDmitriy, Вы писали:

D>Любые идеи приветствуются

В теории ресурсные сборки можно загружать методом Assembly.GetSatelliteAssembly
Но у меня вот такой код
var type = typeof(ServiceHost);
type.Assembly.GetSatelliteAssembly(
    CultureInfo.GetCultureInfo("ru-Ru"));

Выдает ошибку

System.IO.FileNotFoundException
Message=Could not find file 'System.ServiceModel.resources'.


Увы, пря покопать возможности нет, может вы что-то сможете извлечь
Re[2]: Как программно загрузить *.resource.dll из GAS?
От: mDmitriy Россия  
Дата: 16.09.24 08:44
Оценка: 149 (3)
Здравствуйте, Михаил Романов, Вы писали:

Большое спасибо

У меня заработало так:
var assembly = typeof(ClientChannel).Assembly.GetSatelliteAssembly(CultureInfo.CurrentCulture.Parent);

просто там на вход нужна культура "neural"
CurrentCulture -> "ru-Ru"
CurrentCulture.Parent -> "ru"
Отредактировано 16.09.2024 8:46 mDmitriy . Предыдущая версия .
Re[3]: Как программно загрузить *.resource.dll из GAS?
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 16.09.24 09:05
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>просто там на вход нужна культура "neural"

D>CurrentCulture -> "ru-Ru"
D>CurrentCulture.Parent -> "ru"

О! Я тоже думал, как указать нейтральную культуру, но я даже не подумал про такой ход!
Спасибо!

Но основной вопрос — а ускорить получилось?
Re[4]: Как программно загрузить *.resource.dll из GAS?
От: mDmitriy Россия  
Дата: 17.09.24 06:44
Оценка:
Здравствуйте, Михаил Романов, Вы писали:
МР>Но основной вопрос — а ускорить получилось?

некоторые формы да
по крайней мере, разница между первым вызовом и последующими сократилась до десятков миллисекунд, что вполне приемлемо

беда в том что у нас используется DevExpress, а у него есть особенность в самые неподходящие моменты подгружать свои динамические dll, которые он в памяти сам генерит, компилирует и сам же подгружает
что несколько нивелирует все усилия по ускорению
как с этим бороться (т.е. эмулировать заранее) я еще не придумал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.