Различные ссылки Interop на двух разных компьютерах не работают

Когда я добавляю ссылку на Microsoft.Office.Interop.Excel на своем компьютере, Visual Studio добавляет ее в файл проекта:

<COMReference Include="Excel">
  <Guid>{00020813-0000-0000-C000-000000000046}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>5</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

В команде есть еще один разработчик, который получает сообщения об ошибках и ему необходимо добавить в проект файл DLL с именем Interop.Excel.dll, который заменяет приведенный выше код следующим в файле проекта:

<Reference Include="Interop.Excel, Version=1.5.0.0, Culture=neutral, processorArchitecture=MSIL">
  <SpecificVersion>False</SpecificVersion>
  <HintPath>My Project\Interop.Excel.dll</HintPath>
</Reference>

Это работает на моем компьютере.

Не могли бы вы объяснить разницу между двумя методами, какой из них лучше, и как заставить первый работать на других компьютерах?


person Laurent    schedule 22.10.2008    source источник


Ответы (3)


Я тоже не вижу проблемы в вашем подходе.

Обычно VS автоматически создает сборку взаимодействия для COM-компонентов при добавлении ссылки на компонент. Однако при добавлении ссылки на один из компонентов Office (XP или любую более позднюю версию) добавляется ссылка на предварительно созданную (и оптимизированную) основную сборку взаимодействия от Microsoft, как в первом примере. Линия

<WrapperTool>primary</WrapperTool>

означает, что этот PIA используется.

Если вы правильно добавили ссылку PIA, для свойства CopyLocal этой ссылки должно быть установлено значение false, а для свойства Path должно быть что-то вроде

C:\WINDOWS\assembly\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll

Дополнительные сведения о сборках взаимодействия можно найти в этой статье MSDN.

Чтобы первый метод работал, необходимо, чтобы на компьютере были установлены основные сборки взаимодействия Office (PIA). Существует распространяемая версия, доступная от Microsoft:

Насколько я знаю, эти PIA устанавливаются только при установке Office, когда .NET Framework уже установлена, поэтому для PIA существует отдельный распространяемый компонент.

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

person Dirk Vollmar    schedule 25.11.2008
comment
Также обратите внимание, что PIA содержат дополнительный связующий код, который позволяет избежать утечек памяти/ресурсов, которые могут произойти при использовании сгенерированных сборок взаимодействия. - person David Schmitt; 25.01.2010
comment
Как я могу обеспечить использование PIA, а не сгенерированного взаимодействия. Я полагаю, что вижу утечки памяти/ресурсов, упомянутые в комментарии @David Schmitt - person mindless.panda; 11.03.2010
comment
@ user260197: PIA должен быть правильно установлен в системе. Вы можете получить установку от Microsoft, которая выполнит установку. Особенно важно, чтобы PIA был в GAC и зарегистрирован. Подробности см. на странице msdn.microsoft.com/en- us/library/aa679806%28office.11%29.aspx - person Dirk Vollmar; 11.03.2010

Я использовал автоматизацию Excel гораздо чаще, чем хотел бы признать, и я никогда не ссылался на Interop.Excel.dll. Я всегда ссылался на первое. Почему он ссылается на это и какие ошибки он получает?

Вы, ребята, ссылаетесь на ту же версию Excel (5.0 и 11.0)? У вас, ребята, точно такая же версия офиса, сервисных пакетов и всего остального? В этом может быть разница.

person Charles Graham    schedule 22.10.2008

Я нашел самый чистый способ его использования, это также позволяет использовать несколько версий взаимодействия, это создать общий bin\Office Interop\11 или 12\Microsoft.Office.Interop.Excel.dll\ и сослаться на них из проекта, работает для другой версии

person Community    schedule 25.11.2008