Какое преимущество новой функции .NE4 нет функции PIA [развертывание PIA

StackOverflow https://stackoverflow.com/questions/4410414

Вопрос

Это, возможно, я просто не хватаю что-то здесь, но, когда я пишу некоторый код для Interop Excel, вот как это происходит.

  • Я добавляю ссылку на библиотеки Com Excel.
  • VS создает PIA - Microsoft.Office.interop.excel .... (через TLBIMP верно?).
  • Я копирую EXE и интернут (PIA) DLL на любую машину (с .NET) и работает?

Есть ли сценарий, где мне придется развернуть / зарегистрировать PIA? Или у меня здесь есть что-то не так, потому что мне кажется, что встраивает PIA в главную ассамблею, не похоже на большую большую особенность?

Пожалуйста, извините моего невежества, если есть.


Обновлять:
Поэтому я сделал некоторые тесты, я написал приложение, которое открывает Excel, добавляет «Hello» в ячейке и сохраняет файл.

Я построил его на моем компьютере Win7 Dev с установленным Office 2003 (поэтому я ссылался на 2003 год). Интересно, без встроенной PIA приложение 9КБ (Всего 3 PIA до 1,32 МБ). С встроенной PIA EXE является 13 КБ.

Во-вторых, с участием Встроенная PIA, приложение работало на машине с офисом 2007 и 2010 годы. А также без Встроенная PIA, на WinXP + Office2007 она провалилась только тогда, когда PIA не было в каталоге EXE.

Поэтому я думаю, что любой метод, есть какое-то динамическое разрешение? И тогда почему он работал на Win7 без PIA в каталоге EXE, но на WinXP он не удался (только тогда, когда PIA не были в DIE DIE), пролонул ли коробка Win7 PIA, развернутая глобально или что-то в мире?

Спасибо
Гедеон

Это было полезно?

Решение

Это не так, чтобы на самом деле нужна пиа. Вы должны иметь один, если вы выставите любые типы взаимодействия из библиотеки типа Excel в одном из ваших публичных классов. Это верно не так, когда другой код использует ваш класс и не использует ту же ментальную библиотеку. Тип в .NET только идентичен, когда они пришли из той же сборки. Вам будет трудно интерпретировать сообщение об ошибке, как «не может бросить приложение к приложению». PIA гарантирует, что все используют один и тот же тип. Пока все используют одну и ту же версию PIA, которая сама по себе является сложной проблемой. Развертывание собственного взаимодействия DLL вместе с вашим приложением в порядке, если вы можете избежать этого. Что не сложно в большинстве сценариев.

Эта проблема была решена в .NET 4.0 через функцию, называемую «эквивалентность типа». Он специфичен для типов интерфейсов CLR, CLR рассматривает их совместимым, когда они имеют одинаковый [GUID] и одинаковую декларацию, независимо от того, что содержит их сборку. Затем это воспользовалось преимуществами функции «Типы встроенных типов» (так же как «без pia»), компилятор встраивает типы взаимодействия в метаданные вашей сборки. Только те, которые вы на самом деле используете.

Таким образом, вам больше не нужно отправлять библиотеку взаимодействия и не нужна PIA. И это намного меньше, так как вы платите только за типы, которые вы на самом деле используете. Это много Bang для доллара, настоятельно рекомендуется.

Другие советы

Я не сделал много взаимодействия, но я верю, что:

  • Иногда PIA может быть довольно большой; Если сам приложение довольно мало, PIA может карликовать это
  • Подход NO-PIA более гибкий по отношению к версии: до тех пор, пока вы используете только участники, предоставленные версией COM-объекта, который фактически При условии, что у вас все в порядке ... в то время как я думаю, что с подходом PIA нужно использовать PIA для одной и той же версии COM-объекта, как один на целевой машине

Один из ключевых вещей, которые нужно понять о NOPIA, заключается в том, что он не встраивает PIA в вашу сборку, а вместо этого только встраивает часть PIA, которую использует ваше приложение. Это делает это очень прекраснозерно (вплоть до уровня метода). Результатом обычно является очень значимым уменьшением размера развертывания вашего приложения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top