Где использование Interop потерпит неудачу? Не используйте Office.Interop, если Office не установлен. позднее связывание?

Мое приложение Windows Forms использует Novacode DocX для написания документа из шаблона. Часть проекта Novacode работает отлично, и файл сохраняется. Проблема в том, что когда я загружаю документ, поля (Table Of Contents) не обновляются, когда часть Novacode добавляет заголовки и тому подобное.

Я мог и сделал, написать макрос для обновления полей при открытии. Это решит проблему, но не у всех, кто будет использовать мое приложение, будет этот макрос. Я не могу сохранить файл как файл .docm с прикрепленным макросом по разным причинам (предположим, что файл должен быть «.docx»).

Я обнаружил, что сборка Microsoft.office.interop.Word позволяет мне вызывать "Fields.Update". Насколько я понимаю, это поможет, но я не могу заблокировать пользователей, у которых не установлено Word, от запуска моего приложения. Насколько я понимаю, если я «использую Microsoft.Office.Interop.Word» или имею его в своих справочниках, приложение не будет запускаться, если кто-то не знает об этом.

Итак, у меня есть код, который проверяет, установлено ли слово. Если я запустил это, и он был установлен, могу ли я использовать "Поздно Привязка "для запуска кода взаимодействия? На другие связанные вопросы есть ответы, которые указывают на "NetOffice" как на способ запуска взаимодействия без проверки, установлено ли слово.

Я стараюсь сделать это как можно более полным в своем исследовании. Мой вопрос очень похож на этот: «как мне легко проверить случай, когда мое приложение C # не может найти внешнюю сборку? ". Я надеюсь, что эта проблема скоро будет решена для всех, но я не уверен, что это так.

Боковое примечание: если кто-то знает способ обновить поля или даже существующее оглавление текстового документа, который сохранен в формате ".docx" без установленного слова, это было бы здорово знать, и это обошло бы все мои проблема. Хотя все же хотелось бы узнать ответ на вопрос о взаимодействии.

Также это мой первый реальный вопрос по StackOverflow. Если у вас есть теги, которые можно предложить, сделайте это вместе со своим ответом. Если у вас есть отзывы о том, как я задаю свой вопрос, я тоже приму его, но, пожалуйста, не закрывайте / не удаляйте вопрос без ответов. Я связался с похожими вопросами, но на эти вопросы давно не было ответов. Считаю, что все сделал по правилам.


person Celebrating Octopus Emoji    schedule 30.07.2015    source источник
comment
Он будет работать нормально, вы действительно должны убедиться в этом сами. Только вызов конструктора new Word.Application() завершится ошибкой. Вы можете это уловить.   -  person Hans Passant    schedule 30.07.2015
comment
Я больше не совсем понимаю, что вы имеете в виду, говоря «Проверьте это сами». Например, спросите в MSDN вместо SO, или это просто тупое введение в программирование тривиальной вещи, которую я пропустил / забыл. Поскольку Interop.office.word привязан к компиляции, и вам нужно слово для использования interop, разве все это не сработает, а не только new word.application ()?   -  person Celebrating Octopus Emoji    schedule 31.07.2015
comment
Если вы хотите поддержать этот сценарий, вам необходимо протестировать его, чтобы быть уверенным, что он будет работать для ваших клиентов. Поэтому протестируйте свою программу на компьютере, на котором не установлен Office.   -  person Hans Passant    schedule 31.07.2015


Ответы (2)


Это скорее ответ на ваш ", если кто-нибудь знает способ обновить поля или даже существующее оглавление текстового документа, сохраненного в формате" .docx "без установки word" вопрос, но вы можете изучить Open XML SDK для Офис.

Это позволит вам изменять файлы .docx без какой-либо зависимости от установленного Word.

Я нашел этот учебник, который, как мне кажется, делает почти то же самое, что и вы, с помощью Open XML SDK.

person Scott Chamberlain    schedule 30.07.2015
comment
В этом вопросе был довольно хороший способ быстро обновить оглавление, точно так же, как я обсуждаю, и он использует взаимодействие с Office. Я добавил метод , который проверяет, есть ли Word в реестре. Если это правда, то он вызывает код TOC. Мне сказали, что пока я не использую код из Office.Interop.Word, приложение не выйдет из строя. Добавление этой проверки реестра должно предотвратить доступ программы к этому коду и сбой. - person Celebrating Octopus Emoji; 07.08.2015

Много чего сказать, но я думаю, что нашел свои ответы

Главный вопрос заключался в том, добавляю ли я ссылку на «Microsoft.Office.Interop.Word», а у клиента, запускающего приложение, нет слова, где приложение не сработает? Теперь я понимаю, что он не выйдет из строя при запуске, если клиент не скажет. Однако произойдет сбой при достижении кода, использующего «Office.Interop.Word».

Способ предотвратить это - простой метод проверки реестра. Я использовал вариант этого метода для проверки реестра. Затем перед запуском любого из моих кодов, использующих код «Office.Interop.Word», я проверяю, есть ли у клиента слово в реестре. Если они не получат известие, я приму соответствующие действия с уведомлением для своего приложения. Я также заключил код "Office.Interop.Word" в блок исключения "try catch" в качестве двойной меры безопасности. В моем коде исключение будет означать, что слово не установлено. Вариант кода с использованием "Office.Interop.Word", который я использовал для обновления полей, можно найти здесь < / а>.

Novacode DocX может поддерживать файлы Docm , если вы измените код самостоятельно. Я не хотел и не использовал файл docm. Docm-файлы имеют связанные с ними предупреждения системы безопасности при отправке по электронной почте. Поэтому об макросе автоматического обновления не может быть и речи.

-Octopus Emoji празднует

person Celebrating Octopus Emoji    schedule 07.08.2015
comment
Если вы хотите использовать Microsoft.Office.Interop.Outlook, то компонент должен быть установлен в системе. Иначе ничего не получится. - person PreguntonCojoneroCabrón; 31.03.2018