Вопрос

Способ добавления ссылки на COM-взаимодействие Office в Visual Studio заключается в переходе к:

  1. Ссылки
  2. Добавить ссылку
  3. Выберите нужный КОМ вкладка
  4. Выберите Библиотека объектов Microsoft Office 11.0

И появится ссылка с волшебным именем:

Microsoft.Office.Core

Тот Самый Project.csproj файл содержит подробную информацию о ссылке:

<COMReference Include="Microsoft.Office.Core">
   <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>3</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

И проект проверен в системе управления версиями, и все хорошо.


Затем разработчик с Office 2007 получает проект из системы управления версиями и не может его создать, поскольку такой ссылки не существует.

Он (т.е.me) проверяет файл .csproj, удаляет ссылку на

Microsoft Office 11.0 Object Library

и повторно добавляет ссылку COM как

Microsoft Office 12.0 Object Library

И волшебным образом появляется именованная ссылка:

Microsoft.Office.Core

Тот Самый Project.csproj файл содержит подробную информацию о ссылке:

<COMReference Include="Microsoft.Office.Core">
  <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
  <VersionMajor>2</VersionMajor>
  <VersionMinor>4</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

И проект проверен в системе управления версиями, и все хорошо.


Затем разработчик с Офис 2003 получает проект из системы управления версиями и не может его создать, поскольку такой ссылки не существует.

Он (т.е.не я) проверяет файл .csproj, удаляет ссылку на

Microsoft Office 12.0 Object Library

и повторно добавляет ссылку COM как

Microsoft Office 11.0 Object Library

И волшебным образом появляется именованная ссылка:

Microsoft.Office.Core

Тот Самый Project.csproj файл содержит подробную информацию о ссылке:

<COMReference Include="Microsoft.Office.Core">
  <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
  <VersionMajor>2</VersionMajor>
  <VersionMinor>3</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>primary</WrapperTool>
  <Isolated>False</Isolated>
</COMReference>

И проект проверен в системе управления версиями, и все хорошо.

Затем проект создается, прижимается к Компакт-диски, и отправляется клиентам, у которых есть Office 2007.

И не все так хорошо.


В былые времена (т. е.до .NET dll hell), мы бы ссылались на объекты Office, используя прогид , не зависящий от версии, т. е.:

"Excel.Application"

который сводится к clsid установленного Офиса, например

{00024500-0000-0000-C000-000000000046}    

из которого затем создается класс с использованием вызова COM (псевдокод language-netural):

public IUnknown CreateOleObject(string className)
{
    IUnknown unk;

    Clsid classID = ProgIDToClassID(className);
    CoCreateInstance(classID, null, 
          CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, 
          IUnknown, out unk);

    return unk;
}

Вопросы

1) Какова одобренная методика автоматизации установленных приложений Office?

2) Каковы Основные сборки взаимодействия Office 2003 полезно для чего?

3) Если я использую основные сборки взаимодействия Office 2003, должен ли у меня быть установлен Office 2003?

4) Если я создам с помощью основных сборок взаимодействия Office 2003, будут ли мои клиенты навсегда привязаны к Office 20003?

5) Существуют ли какие-либо Office 2007 Основные сборки взаимодействия?

6) Если я установлю основные сборки взаимодействия Office 2007, должен ли у меня быть установлен Office 2007?

7) Что плохого в использовании стандартного COM-взаимодействия для управления Excel, Word или Outlook?например ,:

[ComImport]
[Guid("00024500-0000-0000-C000-000000000046")]
public class Excel
{
}

8) Чего человек достигает, когда добавляет

  • Ссылка к элементам на Вкладка COM,
  • в отличие от использования [ComImport],
  • в отличие от использования Основные сборки взаимодействия Office 2007?

9) Добавляет ли ссылку, используя Вкладка COM идентично использованию COM - взаимодействие, за исключением того , что для этого нужен библиотека типов прежде чем ты сможешь это увидеть?

10) Совместимы ли основные сборки взаимодействия Office 2003 назад и вперед с:- Office 14 - Office 2007 - Office 2003 - Office XP - Office 2000 - Office 97 - Office 95

Если клиент и разработчик установят новую версию Office, будет ли она по-прежнему работать?

11) Должны ли мы поставлять сборки основного взаимодействия Office 2003 с нашим приложением?

12) Должен ли клиент установить основные сборки взаимодействия Office 2003, прежде чем он сможет использовать наше приложение?

13) Если клиент устанавливает основные сборки взаимодействия Office 2003, должны ли они иметь Офис установлен?

14) Если клиент устанавливает основные сборки взаимодействия Office 2003, обязательно ли у него должен быть Office 2003 установлен?

15) Являются ли сборки основного взаимодействия Office 2003 бесплатной, облегченной, распространяемой версией Office 2003?

16) Если на моем компьютере для разработки установлен Office 2007, могу ли я использовать PIA Office 2003 и отправить заказчику с установленным Office XP?

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

Решение 2

Ответ заключается в том, чтобы "Скопировать локально" любую библиотеку dll сборки, которую вы получаете для взаимодействия.Как только у вас появится библиотека dll assembly в вашей выходной папке, добавьте ссылку на нее и проверьте ее в системе управления версиями.

Теперь у всех есть библиотека dll сборки, на которую ссылаются ссылки.

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

Вау, это огромное количество вопросов.Я думаю, что в целом, если ваше приложение использует PIAs, то вы предполагаете, что у вашей целевой аудитории установлена какая-то версия Office.PIA будут установлены в GAC, когда целевой пользователь установит Office.Если у них не установлен Office, то почему вы ориентируетесь на Office?

Да, библиотеки DLL Office - это правильный способ автоматизации Office.Там есть список сборок здесь, включая некоторые для Office 2007.

используете ли вы VSTO (Visual Studio tools для office)?

http://msdn.microsoft.com/en-us/office/aa905533.aspx

Старая тема, и, вероятно, большинство людей были бы довольны CopyLocal = True, однако вот другой способ..Использование и то , и другое (или больше ..?подумайте о Office 2010, если проблема все еще существует ..) ссылки в файлах вашего проекта и либо игнорируйте, либо просто скажите MSBuild игнорировать предупреждение "MSB3284" (библиотека не найдена).Поэтому включите это в свой файл .csproj:

<COMReference Include="Microsoft.Office.Core">
   <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>3</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

За которым следует:

<COMReference Include="Microsoft.Office.Core">
   <Guid>{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}</Guid>
   <VersionMajor>2</VersionMajor>
   <VersionMinor>4</VersionMinor>
   <Lcid>0</Lcid>
   <WrapperTool>primary</WrapperTool>
   <Isolated>False</Isolated>
</COMReference>

Мне было бы интересно узнать, предоставляет ли Microsoft библиотеку NuGet для этого - просто чтобы приучить всех к одному и тому же подходу.Я думаю, что это избавило бы людей от необходимости искать ответы на эти вопросы в Интернете...Я считаю, что это противоречило бы лицензии Microsoft Office, поэтому они единственные, кто может ее предоставить.

Кстати, с copy local вы должны быть осторожны, чтобы не распространять эти библиотеки по ошибке.

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