【问题标题】:AvalonDock slower in 64 bitAvalonDock 在 64 位中较慢
【发布时间】:2014-07-12 15:05:50
【问题描述】:

我在我的应用程序中使用 AvalonDock,并注意到当我以 x64 为目标时,加载布局时它的执行速度似乎要慢得多。当我以 x86 为目标时,布局会立即加载,但在 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 命令来定位每种类型。

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

【问题讨论】:

    标签: xml-serialization 64-bit avalondock


    【解决方案1】:

    我也遇到了这个问题,我找到的唯一解决方案是单独指定类型。我找到了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>
    

    进行这些更改后,我遇到了另一个错误:

    生成的序列化程序集未签名

    已通过从 AssemblyInfo.cs 中删除以下行来禁用签名来解决此问题:

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

    另一种解决方案可能是启用登录Project Properties &gt; Signing,但我没有尝试过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-26
      • 2019-11-01
      • 2011-01-22
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      相关资源
      最近更新 更多