Всем привет!
Есть проект .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), но уж слишком извратно
Здравствуйте, 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'.
Увы, пря покопать возможности нет, может вы что-то сможете извлечь
Здравствуйте, Михаил Романов, Вы писали:
Большое спасибо
У меня заработало так:
var assembly = typeof(ClientChannel).Assembly.GetSatelliteAssembly(CultureInfo.CurrentCulture.Parent);
просто там на вход нужна культура "neural"
CurrentCulture -> "ru-Ru"
CurrentCulture.Parent -> "ru"
Здравствуйте, Михаил Романов, Вы писали:
МР>Но основной вопрос — а ускорить получилось?
некоторые формы да
по крайней мере, разница между первым вызовом и последующими сократилась до десятков миллисекунд, что вполне приемлемо
беда в том что у нас используется DevExpress, а у него есть особенность в самые неподходящие моменты подгружать свои динамические dll, которые он в памяти сам генерит, компилирует и сам же подгружает
что несколько нивелирует все усилия по ускорению
как с этим бороться (т.е. эмулировать заранее) я еще не придумал