У меня относительно простое приложение, но время горячего (второго и т. Д.) Запуска ужасно 3-5 секунд.Профилировщик (VS2010, CPU Sampling) показывает, что более 80% времени тратится на функции Application.RunInternal (~ 40%) и XamlRader.LoadBaml (~ 40%).
Корень проблемы заключается в том, чтоОкно создается в домене приложения не по умолчанию.Если переместить создание окна в AppDomain по умолчанию или дать неограниченный набор разрешений AppDomain, все будет работать так же быстро, как и ожидалось.
Я тестирую на:
- Windows Seven x64
- .Net 4.0
- 4 ГБ ОЗУ
- GeForce 9800GT 1 ГБ.
Я создаю AppDomain следующим образом
var permissionSet = new PermissionSet(null);
permissionSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution | SecurityPermissionFlag.SerializationFormatter | SecurityPermissionFlag.UnmanagedCode));
permissionSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new UIPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new MediaPermission(PermissionState.Unrestricted));
permissionSet.AddPermission(new FileDialogPermission(PermissionState.Unrestricted));
var appDomainSetup =
new AppDomainSetup
{
ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
ApplicationName = AppDomain.CurrentDomain.SetupInformation.ApplicationName,
DisallowApplicationBaseProbing = false,
DisallowBindingRedirects = true,
DisallowCodeDownload = true,
DisallowPublisherPolicy = true,
LoaderOptimization = LoaderOptimization.MultiDomainHost
};
_appDomain =
AppDomain.CreateDomain(
name,
null,
appDomainSetup,
permissionSet,
new[]
{
// a few types I need
typeof(...).Assembly.Evidence.GetHostEvidence<StrongName>(),
});
Поведение остается тем же, даже если я убираю XAML в пустое окно
<Window
x:Class="Rosmurta.Extensibility.WpfUI.RosmurtaWindow"
x:ClassModifier="internal"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Test"
Height="480"
Width="640"
WindowStyle="SingleBorderWindow">
<Grid>
</Grid>
</Window>
Не слишком много для анализа XamlRader.LoadBaml, но оно тратит более 30% времени запускадля пустого окна.
Я пробовал (и это не помогло)
- Добавлениев App.config.
- Добавление атрибута [LoaderOptimization (LoaderOptimization.MultiDomainHost)] к методу Main.
- Добавление подписей ко всем сборкам.
Что еще можно сделать?