2014-07-12 42 views
2

我在我的应用程序中使用AvalonDock,并且注意到当我定位到x64时,它在加载布局时似乎执行得慢很多。当我瞄准x86时,布局立即加载,然而在64位中它会在看到结果之前冻结大约一秒左右。AvalonDock在64位中较慢

这个问题似乎与XmlSerializer在64位运行时表现更差有关,并且搜索时,人们建议在编译时使用sgen.exe生成* .XmlSerializers.dll。但不幸的是,这似乎并没有为运行SGEN后建事件的工作:

“$(SDK40ToolsPath)\x64\sgen.exe” /a:"$(TargetPath)" /force /r "Xceed.Wpf.AvalonDock.dll" 

产生以下错误:

1>EXEC : error : Cannot deserialize type 'Microsoft.Windows.Shell.SystemParameters2' because it contains property 'IsGlassEnabled' which has no public setter. 

我真的不希望有使用/ t命令来定位每个类型。

有没有其他人遇到过这个问题并有解决方案?

回答

0

我遇到了这个问题,我发现的唯一解决方案是单独指定类型。我找到this article by Mikhail Shilkov,它显示了一个简洁的方式来为.csproj文件中的后期构建任务指定多种类型。我只指定在new XmlSerializer()构造函数调用中引用的类型:

<Target Name="AfterBuild" DependsOnTargets="AssignTargetPaths;Compile;ResolveKeySource" Inputs="$(MSBuildAllProjects);@(IntermediateAssembly)" Outputs="$(OutputPath)$(_SGenDllName)"> 
    <!-- This contents of this list was determined by looking at the new XmlSerializer() calls in the code. --> 
    <ItemGroup> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutRoot" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutAnchorablePaneGroup" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutAnchorablePane" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutAnchorable" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutDocumentPaneGroup" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutDocumentPane" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutDocument" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutAnchorGroup" /> 
    <SgenTypes Include="Xceed.Wpf.AvalonDock.Layout.LayoutPanel" /> 
    </ItemGroup> 
    <Delete Files="$(TargetDir)$(TargetName).XmlSerializers.dll" ContinueOnError="true" /> 
    <SGen BuildAssemblyName="$(TargetFileName)" BuildAssemblyPath="$(OutputPath)" References="@(ReferencePath)" ShouldGenerateSerializer="true" UseProxyTypes="false" KeyContainer="$(KeyContainerName)" KeyFile="$(KeyOriginatorFile)" DelaySign="$(DelaySign)" ToolPath="$(SGenToolPath)" Types="@(SgenTypes)"> 
    <Output TaskParameter="SerializationAssembly" ItemName="SerializationAssembly" /> 
    </SGen> 
</Target> 

做了这些改变之后,我遇到了另一个错误:

Generated serialization assembly is not signed

这是通过除去从集信息以下行禁用签名解决。 CS:

#pragma warning disable 1699 
[assembly: AssemblyDelaySign(false)] 
[assembly: AssemblyKeyFile(@"..\..\sn.snk")] 
[assembly: AssemblyKeyName("")] 
#pragma warning restore 1699 

另一种办法是使在Project Properties > Signing签约,但我没有试过。