WPF RichTextBox 拼写检查 ComException
Posted
技术标签:
【中文标题】WPF RichTextBox 拼写检查 ComException【英文标题】:WPF RichTextBox SpellCheck ComException 【发布时间】:2018-04-19 15:11:29 【问题描述】:我在尝试在某些 Windows 8.1 机器上启用拼写检查时遇到了一个异常(两者都有最新更新,操作系统语言是俄语,.NET framework 4.7 是俄语)说:
System.Reflection.TargetInvocationException:调用的目标已抛出异常。 ---> System.Runtime.InteropServices.COMException:值无效 注册表(来自 HRESULT 的异常:0x80040153 (REGDB_E_INVALIDVALUE)) 在 System.StubHelpers.StubHelpers.GetWinRTFactoryObject(IntPtr pCPCMD) 在 Windows.Data.Text.WordsSegmenter..ctor(字符串语言)---结束 内部异常堆栈跟踪 --- 在 System.RuntimeMethodHandle.InvokeMethod(对象目标,对象 [] 参数,签名 sig,布尔构造函数)在 System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr、Binder binder、Object[] 参数、CultureInfo 文化) 在 MS.Internal.WindowsRuntime.ReflectionHelper.ReflectionNew[TArg1](类型 类型,TArg1 arg1) 在 MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter..ctor(字符串 语言)在 MS.Internal.WindowsRuntime.Windows.Data.Text.WordsSegmenter.Create(字符串 语言,布尔值 shouldPreferNeutralSegmenter) 在 System.Windows.Documents.WinRTSpellerInterop.EnsureWordBreakerAndSpellCheckerForCulture(CultureInfo 文化,布尔 throwOnError)在 System.Windows.Documents.WinRTSpellerInterop..ctor() 在 System.Windows.Documents.SpellerInteropBase.CreateInstance() 在 System.Windows.Documents.Speller.EnsureInitialized() 在 System.Windows.Documents.Speller.SetCustomDictionaries(CustomDictionarySources 字典位置,布尔添加)在 System.Windows.Documents.TextEditor.SetCustomDictionaries(布尔添加) 在 System.Windows.Controls.SpellCheck.OnIsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 在 System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.FrameworkElement.OnPropertyChanged(DependencyPropertyChangedEventArgs 吃 System.Windows.DependencyObject.NotifyPropertyChange(DependencyPropertyChangedEventArgs 参数)在 System.Windows.DependencyObject.UpdateEffectiveValue(EntryIndex entryIndex,DependencyProperty dp,PropertyMetadata 元数据, EffectiveValueEntry oldEntry, EffectiveValueEntry& newEntry, Boolean coerceWithDeferredReference,布尔 coerceWithCurrentValue, 操作类型操作类型)在 System.Windows.DependencyObject.SetValueCommon(DependencyProperty dp, 对象值、PropertyMetadata 元数据、布尔值 coerceWithDeferredReference,布尔 coerceWithCurrentValue, OperationType operationType, Boolean isInternal) at System.Windows.DependencyObject.SetValue(DependencyProperty dp,对象 值)
此代码可用于重现问题:
var richTextBox = new RichTextBox();
InputLanguageManager.SetInputLanguage(richTextBox,CultureInfo.GetCultureInfo("en-US"));
richTextBox.SetValue(SpellCheck.IsEnabledProperty, true);
在调查此问题时,我发现s_WinRTType.ReflectionNew<string>(language);
引发了异常,其中 s_WinRTType 描述了类型“Windows.Data.Text.WordsSegmenter, Windows, ContentType=WindowsRuntime。WordsSegmenter 似乎是 WinRT 组件,所以我看不到它里面发生了什么。我想知道它为什么会抛出 REGDB_E_INVALIDVALUE / 它寻找哪个值以及它应该是什么样子?
谢谢!
更新 1。 我还看到这个组件的密钥存在于注册表中: 所以可能这个组件自己抛出异常
【问题讨论】:
【参考方案1】:您需要通过控制面板或使用 DISM 安装不同于语言包的语言功能。对我来说,这需要 .Net 4.7 并且适用于 Windows 10 build 1709(秋季创作者更新)。我不知道这在 Windows 8 上是否可行。
如果您可以正确访问 Windows 更新(不在 WSUS 之后),您可以尝试安装它
Dism /Online /Add-Capability /CapabilityName:Language.Basic~~~zh-CN~0.0.1.0
要检查已安装的功能,这会显示所有已安装的选项:
dism /online /get-capabilities /limitaccess
背景信息:
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/add-language-packs-to-windows
https://docs.microsoft.com/en-us/windows-hardware/manufacture/desktop/dism-capabilities-package-servicing-command-line-options
https://blogs.technet.microsoft.com/mniehaus/2015/08/31/adding-features-including-net-3-5-to-windows-10/
最后一个链接解释了另一个版本 2 的按需功能。 对我来说,它解决了一个问题。
使用按需功能 iso(从您的 msdn 订阅中下载):
对于 Windows 10(不知道这是否适用于 Windows 8): en_windows_10_features_on_demand_part_1_version_1709_updated_sept_2017_x64_dvd_100090755 en_windows_10_features_on_demand_part_2_version_1709_updated_sept_2017_x64_dvd_100090754
解压并安装:
dism /online /add-package /packagepath:d:\features\Microsoft-Windows-LanguageFeatures-Basic-en-us-Package.cab
PS:你用谷歌搜索了 REGDB_E_INVALIDVALUE:VSHost crash, REGDB_E_INVALIDVALUE loading Specific Project
示例:
您可以使用以下代码创建 wpf 测试应用程序: 这将读取可以使用的 AvailableInputLanguages。 (对我来说,它不显示 .Net 4 中的 4 种语言,只显示我使用 Dism 安装的语言。
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ComboBox
ItemsSource="Binding AvailableLanguages"
SelectionChanged="OnLanguageSelectionChanged"
DisplayMemberPath="NativeName"/>
<TextBox x:Name="textBox" Grid.Row="1"
AcceptsReturn="True"
AcceptsTab="True"
SpellCheck.IsEnabled="True"
Text="Hello world"/>
</Grid>
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
AvailableLanguages = new ObservableCollection<CultureInfo>();
foreach (CultureInfo culterInfo in InputLanguageManager.Current.AvailableInputLanguages)
AvailableLanguages.Add(culterInfo);
DataContext = this;
public ObservableCollection<CultureInfo> AvailableLanguages
get return (ObservableCollection<CultureInfo>)GetValue(AvailableLanguagesProperty);
set SetValue(AvailableLanguagesProperty, value);
public static readonly DependencyProperty AvailableLanguagesProperty = DependencyProperty.Register("AvailableLanguages", typeof(ObservableCollection<CultureInfo>), typeof(MainWindow));
private void OnLanguageSelectionChanged(object sender, SelectionChangedEventArgs e)
CultureInfo xmlLanguage = e.AddedItems[0] as CultureInfo;
textBox.Language = XmlLanguage.GetLanguage(xmlLanguage.Name);
【讨论】:
从这里msdn.microsoft.com/en-us/library/… 我读到“在 .NET Framework 4 中,WPF 提供了英语、法语、德语和西班牙语的字典。”那是假的吗? 我必须安装它们。 我会继续调查,给你更多细节,并可能标记你的答案【参考方案2】:试试这个:启动 cmd(以管理员身份运行)
Dism /online /Add-Capability /capabilityname:Language.Basic~~~en-US~0.0.1.0
【讨论】:
很遗憾,现在我没有 8.1 的机器。文档说:“仅当 WPF 提供默认字典时才支持拼写检查器。在 .NET Framework 4 中,WPF 提供英语、法语、德语和西班牙语的字典。” docs.microsoft.com/en-us/dotnet/api/… 。我想避免在客户的机器上安装任何东西。相反,我想使用 WPF 本身提供的默认字典。以上是关于WPF RichTextBox 拼写检查 ComException的主要内容,如果未能解决你的问题,请参考以下文章