5

我有一个在 Visual Studio 2005 中开发的应用程序,我正在使用 ClickOnce 进行部署。我的解决方案包含两个项目——一个用 VB 编码的用户界面层和一个用 C# 编码的类库。我的 C# 类库有一些使用 Outlook 和 Excel 互操作程序集(Microsoft.Office.Interop.Outlook 和 Microsoft.Office.Interop.Excel,均为 11 版)的代码。这是我的问题。

  1. 虽然我还没有发现这是绝对的,但我的理解是,您必须拥有适当版本的 Office 应用程序 (Outlook/Excel) 才能安装使用互操作程序集的应用程序。这个对吗?

如果 (1. = 是) 那么

您将如何处理您的应用程序将 Interop 程序集仅用于几个功能,而这些功能将仅被总用户群中的少数人使用?如果只有部分用户需要使用这些功能,为什么我必须要求我的应用程序的每个用户都安装 Microsoft Office?这些 Interop 程序集只是.dll文件,那么是什么让它们与其他文件如此不同,以至于您不能只将文件与您的项目一起发布并满足参考,而不管客户端上安装了什么软件?(显然,我对 GAC 及其对 Visual Studio 行为的影响知之甚少。)我很乐意编写自己的代码来检查是否存在使用它们的少数功能所需的 Office 软件。没有 Office,无法访问功能...

别的

如果我对此的理解不正确,那么如何设置我的引用和 ClickOnce 设置,以便用户在尝试安装时不会遇到以下错误?

“无法安装或运行该应用程序。该应用程序要求首先将 Assembly Office 版本 11.0.0.0 安装在全局程序集缓存 (GAC) 中。

请联系您的系统管理员。”

  • 我尝试将我的互操作引用 CopyLocal 属性设置为 True 和 False。
  • 在我的 ClickOnce 应用程序文件列表中,我尝试将这些程序集设置为包含、排除和先决条件。
  • 在我的研究中,我看到有些人的这些引用指向 *C:\WINDOWS\assembly\GAC*,我的指向 *C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11*但我还没有找到改变参考路径的方法。根据http://msdn.microsoft.com/en-us/library/ez524kew(VS.80).aspx你不能添加来自 GAC 的引用,那么其他人是如何管理它的呢?
  • 我尝试将 *C:\Program Files\Microsoft Visual Studio 9.0\Visual Studio Tools for Office\PIA\Office11* 中的引用复制到我的项目目录并在那里引用它们。

万一

我想我需要知道的主要事情是如何/是否可以在我的出版物中包含这些程序集并满足或绕过 GAC 要求。

在可能的情况下,请尽量直接回答我的具体问题。虽然文章很有帮助,但我已经阅读了很多文章并尝试了很多建议的解决方案,但都没有成功。请记住,我对这一切如何运作的后勤工作缺乏了解。

请原谅我缺乏理解,并感谢您提供的任何帮助。非常感谢!

4

5 回答 5

8

您可能想看看 NetOffice 项目: http: //netoffice.codeplex.com/

它是免费的(MIT 许可)和完整的(所有版本 2000-2010 和所有 Office 应用程序)与版本无关的互操作程序集。这些程序集是使用工具从实际的 PIA 生成的,因此它们是正确的、完整的和最新的,并且可能会为未来的版本快速更新。

另一个不错的功能是每个成员的 IntelliSense 会显示哪些 Office 版本实现了该成员。

对于部署,您可以使用您的应用程序复制或安装程序集。

于 2011-07-11T18:50:49.727 回答
2

以我的经验,试图在广泛的部署场景中管理办公室互操作程序集是一场噩梦。如果您通过 ClickOnce 进行部署,即使您解决了上面提到的 GAC 问题(如果这是企业环境,可能通过让您的 IT 部门推出互操作程序集的 GAC 注册),您将需要处理以下情况:用户使用的 Office 版本与标准版本不同——当 Office 13 发布并且用户开始升级并且它破坏了您的应用程序时,天堂会帮助您。

为了绕过使用与版本相关的互操作程序集,可以使用 pinvoke 直接对 Office COM 包装器进行办公自动化,这些包装器与版本无关(它们将客户端上的当前办公版本从注册表中拉出)。但是,这将有其自身的部署挑战(例如,您可能需要更新注册表以处理安装了 PIA 的机器,这在使用 ClickOnce 进行部署时可能非常具有挑战性),并且开发起来要困难得多。

如果我站在你的立场上,我会首先仔细研究你在类库中使用的互操作功能——在客户端计算机上的办公室互操作之外,还有其他方法可以提供你需要的功能吗?也许是一种面向服务的解决方案,其中客户端向服务器提交请求以生成定制的办公文档并提供下载...

于 2009-08-06T15:51:18.517 回答
1

这是我从经验中了解到的(我应该指出,我们没有使用 ClickOnce,但我不确定为什么这很重要):

如果您写入 Excel 2003 API 并将其部署到具有 Excel 2007 的机器上,它将起作用,因为 Excel 2007 本质上模拟了 Excel 2003。问题是某些 API 已更改,其中一些甚至已被删除。您必须自己尝试一下,看看您的应用程序是否受到影响。

事实上,情况比这差一点。如果您在安装了 Excel 2003 和 Excel 2007 的机器上运行您的应用程序,您对 Interop 的使用仍将使用 Excel 2007。

一种可能性是使用SpreadsheetGear for .NET,它为您提供了一个完全在一个 .NET 程序集中实现的与 Excel 兼容的 Windows 窗体控件,您可以将其与您的应用程序一起部署 - 因此您的应用程序将不依赖于 Office。

如果您想试用,可以在此处下载免费试用版。

免责声明:我拥有 SpreadsheetGear LLC

于 2009-08-06T16:35:07.337 回答
1

最好的方法是使用后期绑定库

https://sourceforge.net/projects/exceldata/

  • 没有使用不同办公版本的 iterops 和 tlbs 的噩梦
  • 各办事处的支持
  • 易于修改

然而:

  • 很难支持这个库
于 2010-04-07T18:34:46.040 回答
0

使用 COM 接口和后期绑定。VB.NET 一直支持后期绑定。只需使用 Marshal.GetActiveObject() 并将变量的类型设置为 Object。您可以创建一个执行此操作的 VB.NET 对象并从 C# 调用它。

使用 C#,如果您使用反射 API,您将获得后期绑定,但使用它编写代码非常痛苦。在 C# 4 中,您还可以通过动态类型获得后期绑定。

如果执行此操作,则无需分发任何 Office 程序集,只要 Office API 中对象的属性不变,您的代码就可以工作。

后期绑定代码比早期绑定代码慢,但在很多情况下这不是问题。

于 2011-07-11T18:15:48.427 回答