Я пытаюсь интегрировать проверку правописания слов в приложение WinForms. До сих пор в interop lib была сильная боль в тылу. После многих часов беспорядков с ним я наконец получил реальную проверку орфографии, чтобы работать. CheckSpellingOnce, а также основные методы CheckSpelling, как ожидалось, но как только я называю GetSpellingSuggestions, приложение бросает ...Word.Interop document closed
Исключение брошено: «System.Runtime.InteropServices.COMException» в ClosedCaption. Spelling.dll Дополнительная информация: Эта команда не доступна , потому что документ не открыт.
Первая идея состояла в том, что лежащие в основе COM-объект отсоединяется от его соответствующей обертки, поскольку _wordApp вызывается из другого потока, чем он был создан. Поэтому я попробовал называть его из CheckSpelling(), к сожалению, с теми же результатами. Я также попытался открыть и закрыть документ, добавив новый документ в существующий экземпляр приложения, а также получить приложение из самого объекта _document (_document.Application.GetSpellingSuggestions).
Так что же дает?
Дополнительная информация: метод CheckSpellingOnce вызывается из пользовательского интерфейса при запуске события таймера (после того, как пользователь перестает печатать на RichTextField) - так много раз - используя тот же объект _wordApp, поскольку я пытаюсь избежать запуска несколько экземпляров winword.exe.
/// <summary>
/// Checks spelling with the text from the provided richtextbox in a new thread.
/// </summary>
public void CheckSpellingOnce()
{
_checkerThread = new Thread(new ThreadStart(CheckSpelling));
_checkerThread.Start();
}
/// <summary>
/// Checks the spelling of a richtextbox. Raises an event with the result when done.
/// </summary>
private void CheckSpelling()
{
if (_shouldBeChecking)
{
RaiseStatusChanged(SpellCheckStatus.Working);
Word.ProofreadingErrors toReturn = null;
UpdateStringFromTextBox();
if (!string.IsNullOrEmpty(_fromTextBox))
{
_document.Content.Delete();
_document.Words.First.InsertBefore(_fromTextBox);
_document.Content.LanguageID = _language; //Must be set specifically here for some f***d reason.
toReturn = _document.SpellingErrors;
RaiseSpellingChecked(toReturn);
RaiseStatusChanged(SpellCheckStatus.Idle);
}
}
}
public Word.SpellingSuggestions GetSpellingSuggestions(string word)
{
//throw new NotImplementedException();
Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing);
return toReturn;
}
Даже при такой реализации GetSpellingSuggestions, он жалуется на линии «toReturn», а не на тех, которые над ним ...
public void GetSpellingSuggestions(string word)
{
//throw new NotImplementedException();
var _suggestionThread = new Thread(new ThreadStart(() =>
{
_document.Content.Delete();
_document.Words.First.InsertBefore(word);
_document.Content.LanguageID = _language;
Word.SpellingSuggestions toReturn = _wordApp.GetSpellingSuggestions(word, _missing, _missing, _missing, _missing, _missing, _missing);
Debug.Print(toReturn[0].ToString());
}));
_suggestionThread.Start();
}
Вы посмотрели [это] (http://stackoverflow.com/questions/9718687/spell-checking-in-c-sharp-using-word-interop) Вопрос? –
@JeroenHeier У меня - нет радости. –
Ошибка говорит: «Нет документа открыта» _, поэтому сомнительно, что это проблема с потоками. Кроме того, COM-потоковые модели здесь не применяются, потому что мы имеем дело с несколькими процессами. – MickyD