Ответ 1
PIA - это исторический артефакт, который требуется только старым версиям .NET(до версии v4). Они были тщательно и элегантно заменены функцией "Вставить типы взаимодействия", также известной как функция "Нет PIA". Поддерживается с Visual Studio 2010, вы найдете его обратно в окне "Свойства" при выборе ссылочной сборки. По умолчанию он равен True
. Хорошее видео, которое охватывает основные технологии, доступно здесь.
Именно по этой причине Microsoft не публикует PIA для Office 2013, они ожидают, что вы включите типы взаимодействия.
Эта функция очень желательна, она позволяет избежать того, что ваш клиент должен установить PIA на своем компьютере и включить вас в свой установщик. Решение проблемы, когда никто не заботится об этом, является слишком распространенным случаем. Кроме того, PIA для Office очень большие, большое преимущество внедрения типов interop заключается в том, что ваша сборка содержит только те типы, которые вы используете. Многие мегабайты сократились до нескольких килобайт.
Рабочий процесс немного отличается. Вместо добавления ссылки на сборки Microsoft.Office.Interop
, доступные в диалоговом окне "Добавить ссылку", вкладке ".NET Framework", вы теперь используете вкладку "COM". И выберите, скажем, "Microsoft Excel 15.0 Object Library
", чтобы создать типы взаимодействия для программы, использующей Excel. Если вы загружаете старый проект, который ранее использовал PIA, просто удалите эти ссылочные сборки и добавьте их обратно со вкладки COM.
Обратите внимание, что функция потеряна, умышленно нацеливаясь на старую версию Office, которую вы фактически не установили на вашей машине dev, сложнее. Если это требование, то вам все еще нужны PIA для этой версии, принудительно введите типы вложений в True в окне "Свойства". На самом деле это сомнительно, Microsoft с трудом сохраняет новые версии Office полностью совместимыми со старыми версиями. Они держали его на руках уже 15 лет, но у него не было сил. Наихудший сценарий нацелен на более новую версию, чем вы установили на свой компьютер, что может привести к сбою вашей программы с очень трудными для диагностики исключений типа AccessViolationException
.
Обратите внимание, что вы должны внести небольшие изменения в свой код, чтобы он мог работать. Синтетические "XxxxClass
" классы не встроены, а только интерфейсы "Xxxx
". Просто удалите слово "Class
" из нового оператора.