Подтвердить что ты не робот

Как использовать Office из Visual Studio С#?

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

  • Ссылки
  • Добавить ссылку
  • Выберите вкладку COM
  • Выберите Библиотека объектов 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 hell) мы ссылались бы на объекты 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 Primary Interop Assemblies для?

3) Если я использую Primary Interop Assemblies 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 в обратном и вперёд совместимом с:  - Офис 14  - Офис 2007  - Офис 2003  - Office XP  - Офис 2000  - Офис 97  - Офис 95

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

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 4

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

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