Какое преимущество новой функции .NE4 нет функции PIA [развертывание PIA
-
08-10-2019 - |
Вопрос
Это, возможно, я просто не хватаю что-то здесь, но, когда я пишу некоторый код для 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, которую использует ваше приложение. Это делает это очень прекраснозерно (вплоть до уровня метода). Результатом обычно является очень значимым уменьшением размера развертывания вашего приложения.