XAML 解析异常 - 可以在应用程序的调试版本中找到附加属性,但在发布/安装版本中找不到

Posted

技术标签:

【中文标题】XAML 解析异常 - 可以在应用程序的调试版本中找到附加属性,但在发布/安装版本中找不到【英文标题】:XAML parse exception - can find attached property in the debug version of the app, but not in release/installed version 【发布时间】:2021-08-19 21:56:47 【问题描述】:

我有一个附加属性,例如:

namespace Project.Controls.MyControl

    public static class Transform
    
        public static readonly DependencyProperty RelativeOffsetXProperty = DependencyProperty.RegisterAttached(
            "RelativeOffsetX",
            typeof(double),
            typeof(Transform),
            new PropertyMetadata(
                default(double),
                OnRelativeOffsetXChanged));

        // ...
    

使用如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:Project.Controls.MyControl">
    <Style TargetType="x:Type local:MyControl">
        <Style.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="pack://application:,,,/Controls/MyControl/IndexItemStyle.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/Controls/MyControl/ArrowButtonStyle.xaml" />
                    <ResourceDictionary Source="pack://application:,,,/Controls/MyControl/MyControlTemplate.xaml" />
                </ResourceDictionary.MergedDictionaries>
            </ResourceDictionary>
        </Style.Resources>
        
        <!--  more code -->

        <Setter Property="IncreaseInAnimation">
            <Setter.Value>
                <Storyboard>
                    <!-- more code -->
                    <DoubleAnimation BeginTime="0:0:0"
                                     FillBehavior="HoldEnd"
                                     Storyboard.TargetProperty="(local:Transform.RelativeOffsetX)"
                                     From="1"
                                     To="0"
                                     Duration="0:0:0.3" />
                </Storyboard>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

这在调试时效果很好,没有问题。但是在安装应用的生产版本时,它会在启动时崩溃,并出现以下异常:

类型引用找不到名为 'clr-namespace:Project.Controls.MyControl;assembly=Project, Version=X.X.X.0, Culture=neutral, PublicKeyToken=XXXXTransform'的类型

有没有人知道是什么原因造成的,或者有一些关于如何调试它的提示?这个错误完全没有意义,尤其是在调试中一切正常。

注意:一切都在同一个程序集中。

【问题讨论】:

你的意思是public Project.Controls.MyControl实际上应该是namespace Project.Controls.MyControl,并且该命名空间中还有一个名为MyControl的类,其属性名为IncreaseInAnimation,类型为Storyboard? 是的,这就是我的意思。我不能真正从项目中复制粘贴代码,所以这是我的错误。我现在修好了。在 Project.Controls.MyControl 命名空间中有一个 MyControl 类,它具有上述属性。 听起来很奇怪。该控件有一个 Storyboard 属性,您为该属性分配了一个带有 DoubleAnimation 的 Storyboard,它应该为同一控件实例上的附加属性设置动画?为什么故事板应该由控件属性存储? 这不是我的代码,它基于这个项目github.com/GuOrg/Gu.Wpf.FlipView。我不得不根据自己的需要组装零件并对其进行修改,但这无关紧要。启动调试时,代码按预期工作。由于某种原因,产品版本中的类型引用失败。 尝试提供Minimal, Reproducible Example。 【参考方案1】:

原来这个问题与 WPF 无关。我们使用的混淆器只是简单地优化了这个类。解决方案是将此文件排除在混淆之外。

【讨论】:

以上是关于XAML 解析异常 - 可以在应用程序的调试版本中找到附加属性,但在发布/安装版本中找不到的主要内容,如果未能解决你的问题,请参考以下文章

WPF 引发异常解析 XAML,其中包括 Winforms 用户控件

uwp xaml 解析失败,类库 dll

使用异步和 UWP 调试异常

由于我的样式而发生解析异常

在不同版本的 OSX 上调试 XCode 之外的应用程序(查看异常、日志等)

在 Rider IDE 中调试时重新加载 WPF XAML?