我有相对简单的应用程序,但热(第二次等)启动时间很糟糕,需要 3-5 秒。 Profiler(VS2010,CPU 采样)显示超过 80% 的时间花费在 Application.RunInternal (~40%) 和 XamlRader.LoadBaml (~40%) 函数上。
问题的根源是Window是在非默认的AppDomain中创建的。如果我将窗口创建移至默认 AppDomain 或给予 AppDomain 无限制的权限设置,一切都会如预期的那样快。
我正在测试:
- Windows 7 x64
- .Net 4.0
- 4Gb RAM
- GeForce 9800GT 1Gb。
我用这种方式创建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.Multi Domain Host)] 属性添加到 Main 方法。
- 向所有程序集添加签名。
还可以做什么?