Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中调试静态构造函数_C#_Wpf_.net Core_Mvvm_.net 5 - Fatal编程技术网

C# 在WPF中调试静态构造函数

C# 在WPF中调试静态构造函数,c#,wpf,.net-core,mvvm,.net-5,C#,Wpf,.net Core,Mvvm,.net 5,我遇到了这样一种情况:我想调试WPF项目中的静态构造函数,但它似乎是在连接调试器之前执行的。这涉及调试viewmodel,其配置取决于我是否在设计WPF UI元素(即在VS设计器中查看WPF窗口)或运行应用程序 这是Net5(Net Core)WPF应用程序的一部分,该应用程序使用预发布的Microsoft.Toolkit.Mvvm包 以下是相关的viewmodel构造函数代码: public class MainViewModel : ObservableRecipient { pri

我遇到了这样一种情况:我想调试WPF项目中的静态构造函数,但它似乎是在连接调试器之前执行的。这涉及调试viewmodel,其配置取决于我是否在设计WPF UI元素(即在VS设计器中查看WPF窗口)或运行应用程序

这是Net5(Net Core)WPF应用程序的一部分,该应用程序使用预发布的Microsoft.Toolkit.Mvvm包

以下是相关的viewmodel构造函数代码:

public class MainViewModel : ObservableRecipient
{
    private readonly IJ4JLogger _logger;
    private readonly DesktopImagerDataLayer _dataLayer;

    public MainViewModel()
    {
        if( !AppConfiguration.InDesignMode )
            _dataLayer = AppConfiguration.ServiceProvider.GetRequiredService<DesktopImagerDataLayer>();

        _logger = AppConfiguration.ServiceProvider.GetRequiredService<IJ4JLogger>();
        _logger.SetLoggedType( this.GetType() );

    }
}
因为viewmodel在XAML窗口定义中被引用,静态构造函数显然会在WpfSurface进程启动时被调用……这很好,只是因为我知道调试设计时问题的唯一方法是将VS的另一个实例附加到WpfSurface进程,所以我有一个鸡和蛋的问题:)

我发现的唯一解决方法是让AppConfiguration将这些属性作为实例属性提供,并在需要访问它们时创建AppConfiguration的实例(例如,在viewmodel构造函数中)。这使我能够连接到WpfSurface并调试AppConfiguration的工作方式……但这并不十分方便。另外,每次我需要使用IServiceProvider时,似乎都会重新创建它,这不是一个好的做法,所以我不希望在发布的产品中使用它


在WPF项目中,是否有其他方法在设计时调试静态构造函数?是否有一种不同的方法来创建应用程序范围的单实例属性(例如,IServiceProvider),我应该在WPF项目中使用这种方法,这样就不需要静态构造函数了?

您不能在调试器中启动程序,而不是将调试器附加到正在运行的进程上。或者,您可以添加一条语句(仅适用于Windows)Thanx,@KlausGütter。在设计时,应用程序未运行,但WpfSurface进程仍会评估部分代码库,以显示窗口的“实时”视图。但我会尝试一下Debugger.Launch()的想法,因为我已经忘记了这一点。“有没有一种不同的方法来创建应用程序范围的单实例属性(例如,IServiceProvider),我应该在WPF项目中使用它,这样就不需要静态构造函数了?”-依赖项注入容器
public class AppConfiguration
{
    static AppConfiguration()
    {
        var prop = DesignerProperties.IsInDesignModeProperty;

        InDesignMode = (bool)DependencyPropertyDescriptor
            .FromProperty(prop, typeof(System.Windows.FrameworkElement))
            .Metadata.DefaultValue;

        var builder = new AppServicesBuilder(
            "c:/Programming/DesktopImager/DesktopImagerManager/design-time-settings");

        if (!InDesignMode)
            builder.AddModule(new DesktopImagerDbAutofacModule());

        ServiceProvider = builder.Build();

        ScaledFolder = builder.ScaledFolder;
        ThumbnailFolder = builder.ThumbnailFolder;
    }

    public static IServiceProvider ServiceProvider { get; }
    public static string ScaledFolder { get; }
    public static string ThumbnailFolder { get; }
    public static bool InDesignMode { get; }
}