且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何通过VS断点操作在外部程序集中访问自定义记录器

更新时间:2023-02-16 17:45:09

我发现可以引用我的记录器。例如,如果我的主窗口局部类看起来像这样……

I figured out that I can reference my logger. For example, if my main window partial class looks like this...

namespace EventSetterNull_SO_41604891_2670182
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window

...然后我可以像这样引用它。 ..

...then I can reference it like this...

((EventSetterNull_SO_41604891_2670182.MainWindow)System.Windows.Application.Current.MainWindow)

所以,我的断点就像...

So, my breakpoint is like...

然后,我可以在例如System.Windows.Markup.WpfXamlLoader.TransformNodes中设置断点,将xamlReader传递给我的记录器,然后注销解析器从中生成的节点结构

Then, I can set breakpoints in, for example, System.Windows.Markup.WpfXamlLoader.TransformNodes, pass the xamlReader to my logger, and log out the node structure that the parser generates from the baml.

<Window x:Class="EventSetterNull_SO_41604891_2670182.BuildInXaml"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EventSetterNull_SO_41604891_2670182"
        mc:Ignorable="d"
        Title="BuildInXaml" Height="350" Width="525">
    <Window.Resources>
        <SetterBaseCollection x:Key="ButtonStyleSetters">
            <Setter Property="FrameworkElement.Height" Value="30"></Setter>
        </SetterBaseCollection>
    </Window.Resources>

    <Button Name="Button1"
            local:Behaviours.StyleSetters="{StaticResource ButtonStyleSetters}" />



输出窗口



Output window

"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/winfx/2006/xaml/presentation"
"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/winfx/2006/xaml"
"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/expression/blend/2008"
"Line:    6    NamespaceDeclaration    http://schemas.openxmlformats.org/markup-compatibility/2006"
"Line:    6    NamespaceDeclaration    clr-namespace:EventSetterNull_SO_41604891_2670182;assembly=EventSetterNull-SO-41604891-2670182"
"Line:    6    StartObject    BuildInXaml" 
"Line:    6        StartMember    Title"
"Line:    6            Value    BuildInXaml"
"Line:    6        EndMember    "
"Line:    8        StartMember    Height"
"Line:    8            Value    System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line:    8        EndMember    "
"Line:    8        StartMember    Width"
"Line:    8            Value    System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line:    8        EndMember    "
"Line:    8        StartMember    Resources"
"Line:    9            GetObject    System.Windows.Baml2006.Baml2006SchemaContext"
"Line:    9                StartMember    DeferrableContent"
"Line:    9                    Value    System.IO.MemoryStream"
"Line:    9                EndMember    "
"Line:    9            EndObject    "
"Line:   15        EndMember    "
"Line:   17        StartMember    Content"
"Line:   17            StartObject    Button" 
"Line:   17                StartMember    ConnectionId"
"Line:   17                    Value    1"
"Line:   17                EndMember    "
"Line:    0                StartMember    Name"
"Line:    0                    Value    Button1"
"Line:    0                EndMember    "
"Line:   17                StartMember    StyleSetters"
"Line:   17                    Value    System.Windows.StaticResourceExtension"
"Line:   17                EndMember    "
"Line:   10                StartObject    SetterBaseCollection" 
"Line:   10                    StartMember    _Items"
"Line:   11                        StartObject    Setter" 
"Line:   11                            StartMember    Property"
"Line:   11                                Value    Height"
"Line:   11                            EndMember    "
"Line:   11                            StartMember    Value"
"Line:   11                                Value    30"
"Line:   11                            EndMember    "
"Line:   11                        EndObject    "
"Line:   11                    EndMember    "
"Line:   11                EndObject    "
"Line:   18            EndObject    "
"Line:   18        EndMember    "
"Line:   18    EndObject    "

所以,我可以确切地看到wpf如何看到xaml,如果拧紧了它就很方便...

So, I can see exactly how wpf sees the xaml, which is handy if it screws up...

<Window x:Class="EventSetterNull_SO_41604891_2670182.BuildInXaml"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EventSetterNull_SO_41604891_2670182"
        mc:Ignorable="d"
        Title="BuildInXaml" Height="350" Width="525">
    <Window.Resources>
        <SetterBaseCollection x:Key="ButtonStyleSetters">
            <Setter Property="FrameworkElement.Height" Value="30"></Setter>
            <EventSetter Event="ButtonBase.Click"  Handler="StyleClick"
                          HandledEventsToo="False" />
        </SetterBaseCollection>
    </Window.Resources>

    <Button Name="Button1"
            local:Behaviours.StyleSetters="{StaticResource ButtonStyleSetters}" />



输出窗口



Output window

"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/winfx/2006/xaml/presentation"
"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/winfx/2006/xaml"
"Line:    6    NamespaceDeclaration    http://schemas.microsoft.com/expression/blend/2008"
"Line:    6    NamespaceDeclaration    http://schemas.openxmlformats.org/markup-compatibility/2006"
"Line:    6    NamespaceDeclaration    clr-namespace:EventSetterNull_SO_41604891_2670182;assembly=EventSetterNull-SO-41604891-2670182"
"Line:    6    StartObject    BuildInXaml" 
"Line:    6        StartMember    Title"
"Line:    6            Value    BuildInXaml"
"Line:    6        EndMember    "
"Line:    8        StartMember    Height"
"Line:    8            Value    System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line:    8        EndMember    "
"Line:    8        StartMember    Width"
"Line:    8            Value    System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line:    8        EndMember    "
"Line:    8        StartMember    Resources"
"Line:    9            GetObject    System.Windows.Baml2006.Baml2006SchemaContext"
"Line:    9                StartMember    DeferrableContent"
"Line:    9                    Value    System.IO.MemoryStream"
"Line:    9                EndMember    "
"Line:    9            EndObject    "
"Line:   15        EndMember    "
"Line:   17        StartMember    Content"
"Line:   17            StartObject    Button" 
"Line:   17                StartMember    ConnectionId"
"Line:   17                    Value    1"
"Line:   17                EndMember    "
"Line:    0                StartMember    Name"
"Line:    0                    Value    Button1"
"Line:    0                EndMember    "
"Line:   17                StartMember    StyleSetters"
"Line:   17                    Value    System.Windows.StaticResourceExtension"
"Line:   17                EndMember    "
"Line:   10                StartObject    SetterBaseCollection" 
"Line:   10                    StartMember    _Items"
"Line:   11                        StartObject    Setter" 
"Line:   11                            StartMember    Property"
"Line:   11                                Value    Height"
"Line:   11                            EndMember    "
"Line:   11                            StartMember    Value"
"Line:   11                                Value    30"
"Line:   11                            EndMember    "
"Line:   11                        EndObject    "
"Line:   12                        StartObject    EventSetter" 
"Line:   12                            StartMember    Event"
"Line:   12                                Value    System.Windows.Baml2006.TypeConverterMarkupExtension"
"Line:   12                            EndMember    "
"Line:   12                            StartMember    Event"
Exception thrown: 'System.Xaml.XamlDuplicateMemberException' in System.Xaml.dll

如您所见,wpf感到困惑,并在EventSetter对象中找到第二个Event成员,但不存在,并抛出错误。



这是wpf中的错误。

As you can see, wpf is getting confused and finding a second Event member in the EventSetter object, that's not there and throwing an error.

This is a bug in wpf.