.NET7/8 WPF商店打包应用访问Windows.Storage遇初始化异常
解决MSIX打包的.NET7/.NET8 WPF应用访问Windows.Storage的异常问题
当WPF应用打包为MSIX(应用商店格式)后,直接调用Windows.Storage.ApplicationData.Current会抛出System.TypeInitializationException(内部为COMException: ClassFactory cannot supply requested class),原因是非UWP的.NET应用在MSIX容器中需要正确初始化WinRT运行时环境,或可改用.NET原生API绕过WinRT依赖。
方案一:初始化WinRT运行时
在应用启动早期(如App.xaml.cs的OnStartup方法)添加WinRT初始化代码,确保WinRT组件正常激活:
protected override void OnStartup(StartupEventArgs e) { WinRT.ComWrappersSupport.InitializeWinRT(); Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.File(Path.Combine(ApplicationData.Current.LocalFolder.Path, "app.log")) .CreateLogger(); base.OnStartup(e); }
方案二:改用.NET原生API获取应用数据目录
无需依赖WinRT组件,直接使用.NET的Environment类获取MSIX隔离后的本地应用数据目录(自动指向应用的LocalState目录):
var localDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.File(Path.Combine(localDataPath, "app.log")) .CreateLogger();
补充说明
- 方案一适用于需要调用更多WinRT API的场景,初始化后即可解决COM激活异常。
- 方案二更简洁,基于.NET原生API,兼容性更强,无需依赖WinRT组件。
- 你的项目目标框架
net7.0-windows10.0.22621.0已包含WinRT支持,无需额外安装NuGet包。
内容的提问来源于stack exchange,提问作者Franck E
相关产品推荐
相关产品推荐

