Как использовать Office из Visual Studio C #? - PullRequest
12 голосов
/ 31 декабря 2008

Метод добавления ссылки на COM-взаимодействие Office в Visual Studio заключается в следующем:

  1. Ссылки
  2. Добавить ссылку
  3. Выберите вкладку COM
  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 получает проект из системы контроля версий и не может его построить, поскольку такой ссылки не существует.

Он (то есть я) проверяет файл .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>

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


Затем разработчик с Office 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) мы ссылались на объекты Office, используя независимый от версии ProgID , т. Е.

"Excel.Application"

, который разрешает clsid установленного Office, например,

{00024500-0000-0000-C000-000000000046}    

, из которых затем создается класс с использованием вызова COM (языково-нетурный псевдокод):

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? e.g.:

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

8) Что можно достичь, если добавить

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

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

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

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

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 31 декабря 2008

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

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

2 голосов
/ 12 января 2009

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

Теперь у каждого есть ссылка на сборку dll.

1 голос
/ 20 декабря 2011

Старый поток, и, вероятно, большинство людей были бы довольны 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, поэтому они единственные, кто ее предоставляет.

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

1 голос
/ 31 декабря 2008

Вы используете VSTO (Visual Studio Tools для офиса)?

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

...