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