Среда выполнения .Net загружает сборки только по мере необходимости - если вы сохраняете свой исполняемый файл настолько маленьким, насколько это возможно (всего лишь минимальный минимум, необходимый для отображения заставки), и помещаете оставшуюся часть кода в более крупную сборку, чем в теории Ваш заставочный экран может быть показан очень быстро, прежде чем загрузится большая сборка.
Ключом к достижению этого является понимание того, когда .Net Framework будет пытаться загрузить сборку - точнее, он загрузит сборку непосредственно перед тем, как начнет выполнять любой метод, который ссылается на тип, содержащийся в этой сборке. Попробуйте поэкспериментировать со следующей программой, чтобы лучше это понять:
// Contained in FirstAssembly.exe
class Program
{
static void Main()
{
PrintLoadedAssemblies("start of Main");
innerMain();
}
static void innerMain()
{
PrintLoadedAssemblies("start of innerMain");
OtherClass obj;
}
static void PrintLoadedAssemblies(string point)
{
Console.WriteLine("Loaded assemblies at {0}", point);
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
Console.WriteLine(assembly.FullName);
}
}
}
// Contained in OtherAssembly.dll
class OtherClass
{
}
Вооружившись этим знанием, мы теперь знаем, что для того, чтобы наш экран-заставка отображался перед загрузкой второй более крупной сборки, нам нужно убедиться, что наш экран-заставка отображается перед тем, как мы выполним любой метод, который ссылается на любой тип в нашей большей сборке. - мне сложно это проверить, но если у нас достаточно стандартный экран-заставка:
static void Main()
{
Application.Run(new SplashScreen());
}
Тогда первая точка, в которой мы должны ссылаться на любые типы в большей сборке, должна быть в чем-то вроде SplashScreen_Shown
, что-то вроде:
void SplashScreen_Shown(object sender, EventArgs e)
{
(new MainForm()).Show();
this.Hide();
}
Также обратите внимание, что это произойдет в главном потоке / пользовательском интерфейсе, и поэтому ваш заставка не отвечает во время загрузки более крупной сборки - если это недопустимо, вам необходимо изменить код выше, чтобы метод, содержащий MainForm
ссылка находится в асинхронном потоке.