我有一个相对简单的应用程序,但热启动(第二次等)需要3-5秒,这太慢了。分析器(VS2010,CPU抽样)显示超过80%的时间花费在Application.RunInternal(约40%)和XamlRader.LoadBaml(约40%)函数中。
问题的根源是Window在非默认AppDomain中创建。如果我将Window创建移至默认AppDomain或为AppDomain提供无限制的权限集,则一切都像预期的那样快。
我的测试环境:
我是这样创建AppDomain的:
即使我将XAML裁剪成空窗口,行为仍然保持不变。
问题的根源是Window在非默认AppDomain中创建。如果我将Window创建移至默认AppDomain或为AppDomain提供无限制的权限集,则一切都像预期的那样快。
我的测试环境:
- Windows Seven 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中添加<generatePublisherEvidence enabled="false"/>
- 在Main方法中添加[LoaderOptimization(LoaderOptimization.MultiDomainHost)]属性
- 给所有程序集添加签名
还有什么其他的方法可以尝试吗?