13

在 Visual Studio 中添加对 Office 的 COM 互操作的引用的技术是:

  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>

并且该项目已签入源代码管理,一切都很好。

然后构建项目,将其压缩到CD上,然后发送给拥有Office 2007的客户。

一切都不好。


在过去(即在 .NET dll 地狱之前),我们会使用与版本无关的 ProgID来引用 Office 对象,即:

"Excel.Application"

解析为已安装 Office 的clsid,例如

{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 有什么问题?例如:

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

8) 当一个人添加一个

  • 参考COM 选项卡上的项目,
  • 与使用 [ComImport] 不同,
  • 而不是使用Office 2007 主互操作程序集

9) 使用COM 选项卡添加引用是否与使用COM interop相同,只是它需要一个类型库才能看到它?

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 主要互操作程序集,他们是否必须安装Office

14) 如果客户安装 Office 2003 主互操作程序集,他们是否必须安装 Office 2003

15) Office 2003 Primary Interop Assembles 是 Office 2003 的免费、精简、可再发行版本吗?

16) 如果我的开发机器安装了 Office 2007,我是否可以使用 Office 2003 PIA,并运送给安装了 Office XP 的客户?

4

4 回答 4

2

哇,这是一大堆问题。我认为,一般来说,如果您的应用程序使用 PIA,那么您假设您的目标受众安装了某些版本的 Office。当目标用户安装 Office 时,PIA 将安装在 GAC 中。如果他们没有安装 Office,那么您为什么要针对 Office?

是的,Office dll 是自动化 Office 的正确方法。这里有一个程序集列表,包括一些用于 Office 2007 的程序集。

于 2008-12-30T22:13:17.113 回答
2

答案是“复制本地”任何您为互操作获得的程序集 dll。在输出文件夹中拥有程序集 dll 后,添加对它的引用,并将其检入源代码管理。

现在每个人都有引用的程序集 dll。

于 2009-01-12T19:00:52.857 回答
1

你使用 VSTO(Visual Studio 办公工具)吗?

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

于 2008-12-30T22:05:02.247 回答
1

一个旧线程,可能大多数人会对 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>

我很想看看微软是否为此提供了一个 NuGet 库——只是为了让每个人都采用相同的方法。我认为这将消除人们在网上搜索这些答案的必要性......我相信这将违反 Microsoft Office 的许可证,因此他们是唯一提供它的人。

顺便说一句,使用本地副本,您必须小心不要错误地重新分发这些库。

于 2011-12-20T07:29:45.143 回答