编写部署后操作以使用 ClickOnce 复制 Office 2010 文档

Office 可视操作方法

**摘要:**您可以使用 ClickOnce 部署来部署 Office 解决方案,还可以执行部署后操作(例如,在安装过程中将文档复制到用户计算机)。创建部署后操作需要编写一些代码并修改应用程序清单。

上次修改时间: 2015年3月9日

适用范围: Excel 2010 | Office 2010 | Open XML | PowerPoint 2010 | VBA | Word 2010

**发布时间:**2010 年 8 月

**供稿人:**Robert Green,MVP,MCW Technologies(该链接可能指向英文页面)

概述

方案:通过使用 Microsoft Visual Studio 2010 创建一个 Microsoft Word 2010 文档级别解决方案。您已在计算机上测试该解决方案,现在您希望将其部署到用户。可以使用 ClickOnce 来部署自定义项程序集。您希望同时部署文档和自定义项程序集,并使用户无需单独下载文档。Visual Studio Tools for Office 运行时可在用户安装 Office 解决方案后执行部署后操作。这些操作可包括:将文档复制到用户计算机、创建注册表项、创建数据库以及很多其他可能的操作。

ClickOnce 将使用应用程序清单来确定要安装的项及其安装方式。应用程序清单可包含有关运行部署后操作的说明。Visual Studio 无法向应用程序清单中添加部署后操作。您必须自行修改它。本文介绍如何创建部署后操作,以便在用户安装 Word 文档级别解决方案时将文档复制到用户计算机。有关如何使用 ClickOnce 来部署 Office 解决方案的详细信息,请参阅"浏览"一节中的链接。

编码

按照这些步骤进行操作可将 ClickOnce 配置为运行部署后操作。

  1. 在 Visual Studio 2010 中,加载原始示例项目 Post Deployment Actions Start\PostDeploymentActions.sln。

  2. 在"文件"菜单上,选择"添加",然后单击"新建项目"。

  3. 在"添加新项目"对话框中,选择"已安装的模板"窗格中的"Windows"。选择"模板"窗格中的"类库"。将项目命名为 PostDeploymentAction,然后单击"确定"向解决方案中添加该项目。

  4. 在"项目"菜单上,选择"添加引用"以显示"添加引用"对话框。选择该对话框的".NET"选项卡。

  5. 如果您的解决方案面向的是 Word 2007,则请选择 Microsoft.VisualStudio.Tools.Applications.Runtime.v10.0 和 Microsoft.VisualStudio.Tools.Applications.ServerDocument.v10.0。

  6. 如果您的解决方案面向的是 Word 2010,则请选择 Microsoft.VisualStudio.Tools.Applications.Runtime 和 Microsoft.VisualStudio.Tools.Applications.ServerDocument。

  7. 单击"确定"以添加引用并关闭该对话框。

  8. 在"解决方案资源管理器"窗口中,右键单击"Class1.vb"或"Class1.cs",并选择"重命名"。将文件重命名为 CopyWordDocument.vb 或 CopyWordDocument.cs。

  9. 在代码编辑器中,将以下代码添加到该文件的顶部。

    Imports Microsoft.VisualStudio.Tools.Applications.Deployment
    Imports Microsoft.VisualStudio.Tools.Applications
    Imports System.IO
    using Microsoft.VisualStudio.Tools.Applications.Deployment;
    using Microsoft.VisualStudio.Tools.Applications;
    using System.IO;
  10. 部署后操作将实现 IAddInPostDeploymentAction 接口。更改 CopyWordDocument 类的声明,使其实现此接口。类声明应与下面的代码类似。

    Public Class CopyWordDocument
      Implements IAddInPostDeploymentAction
    class CopyWordDocument: IAddInPostDeploymentAction
  11. 在 Visual Basic 中,按 Enter 以创建接口所需的过程存根。在 C# 中,右键单击接口名称并选择"实现接口",然后实现接口(再次)以生成存根。

  12. IAddInPostDeploymentAction 接口的 Execute 方法将执行部署后操作。如果您使用的是 C#,则删除 Execute 方法中的代码。向 Execute 方法中添加以下代码。

    Dim docsDirectory As String = "Docs\MyFabrikamWordDocument.docx"
    Dim documentFile As String = "MyFabrikamWordDocument.docx"
    Dim sourcePath As String = args.AddInPath
    Dim deploymentManifestUri As Uri = args.ManifestLocation
    Dim destPath As String = _
      Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
    Dim sourceFile As String = _
      System.IO.Path.Combine(sourcePath, docsDirectory)
    Dim destFile As String = System.IO.Path.Combine(destPath, documentFile)
    
    Select Case args.InstallationStatus
      Case AddInInstallationStatus.InitialInstall, _
        AddInInstallationStatus.Update
        If File.Exists(destFile) Then
          File.Delete(destFile)
        End If
        File.Copy(sourceFile, destFile)
        ServerDocument.RemoveCustomization(destFile)
        ServerDocument.AddCustomization(destFile, deploymentManifestUri)
        Exit Select
      Case AddInInstallationStatus.Uninstall
        If File.Exists(destFile) Then
          File.Delete(destFile)
        End If
        Exit Select
    End Select
    string docsDirectory = "Docs\\MyFabrikamWordDocument.docx";
    string documentFile = "MyFabrikamWordDocument.docx";
    string sourcePath = args.AddInPath;
    Uri deploymentManifestUri = args.ManifestLocation;
    string destPath = Environment.GetFolderPath(
      Environment.SpecialFolder.DesktopDirectory);
    string sourceFile = System.IO.Path.Combine(sourcePath, docsDirectory);
    string destFile = System.IO.Path.Combine(destPath, documentFile);
    
    if ((args.InstallationStatus == 
      AddInInstallationStatus.InitialInstall) || 
      (args.InstallationStatus == AddInInstallationStatus.Update))
    {
      if (File.Exists(destFile))
      {
        File.Delete(destFile);
      }
      File.Copy(sourceFile, destFile);
      ServerDocument.RemoveCustomization(destFile);
      ServerDocument.AddCustomization(destFile, deploymentManifestUri);
      return;
    }
    else if (args.InstallationStatus == 
      AddInInstallationStatus.Uninstall)
    {
      if (File.Exists(destFile))
      {
        File.Delete(destFile);
      }
      return;
    }

如果您使用的是 Visual Basic 且面向的是 .NET Framework 4,则无需在此代码中使用下划线。

在安装或更新解决方案时,此代码会将 Word 文档复制到用户桌面上。如果已有该文档,则代码会先将其删除。然后,代码会更新文档的 _AssemblyLocation 属性,以便复制的文档可查找自定义项程序集。在卸载解决方案时,代码将删除文档。

> [!NOTE] >

在发布时,如果您面向的是 .NET Framework 4,则将无法运行卸载代码。在卸载解决方案时,用户必须手动删除文档。计划在发布后进行的服务更新将更改此行为,以便执行卸载操作。

  1. 在"解决方案资源管理器"窗口中,选择 MyFabrikamWordDocument 项目。

  2. 在"项目"菜单上,选择"添加引用"以显示"添加引用"对话框。选择该对话框的"项目"选项卡。

  3. 选择 PostDeploymentActions 项目。

  4. 单击"确定"以添加引用并关闭该对话框。

  5. 在项目的"Docs"文件夹中,选择 MyFabrikamWordDocument.docx。

  6. 在"属性"窗口中,您会发现,"生成操作"属性将设置为"内容",而"复制到输出目录"属性将设置为"如果较新则复制"。

  7. 保存您的更改并生成解决方案。

  8. 在"生成"菜单上,选择"发布 MyFabrikamWordDocument"。Visual Studio 将显示发布向导。

    图 1. 使用发布向导来发布 Office 解决方案


    发布向导

  9. 输入一个要将应用程序发布到的位置。

  10. 单击"完成"以发布解决方案并关闭发布向导。

  11. 在 Windows 资源管理器中,导航到发布文件夹。

    图 2. 发布文件夹的内容


    发布文件夹内容

    发布文件夹不仅包含文档和安装程序,还包含部署清单 (MyFabrikamWordDocument.vsto)。这将介绍应用程序的部署方式。其中包含应用程序清单的位置和客户端应运行的应用程序的版本。

  12. 双击 Application Files 文件夹。其中包含一个 MyFabrikamWordDocument_1_0_0_0 文件夹。该文件夹中包含安装 1.0.0.0 版的解决方案所需的文件。

  13. 双击 MyFabrikamWordDocument_1_0_0_0 文件夹。

    图 3. MyFabrikamWordDocument_1_0_0_0 文件夹的内容


    文件夹内容

    此文件夹包含文档、自定义项程序集 (MyFabrikamWordDocument.dll.deploy) 和部署后操作程序集 (PostDeploymentAction.dll.deploy)。它还包含部署清单 (MyFabrikamWordDocument.vsto) 和应用程序清单 (MyFabrikamWordDocument.dll.manifest)。

应用程序清单包含运行 Office 解决方案所需的必备组件和依赖程序集的列表。它还列出了特定的文档级别自定义项或应用程序级别自定义项所需的程序集。您可以修改此文件,并添加有关部署后操作的部分。在修改文件后,您必须重新签署文件。之后,您必须更新并重新签署部署清单。

  1. 在 Visual Studio 中,在"文件"菜单上选择"打开文件"。

  2. 在"打开文件"对话框中,导航到发布文件夹中的 Application Files\MyFabrikamWordDocument_1_0_0_0 文件夹。

  3. 选择 MyFabrikamWordDocument.dll. 清单,然后单击"打开"以打开此文件。

  4. 在 </vstav3:update> 元素后添加以下 XML。

    <vstav3:postActions>
      <vstav3:postAction>
        <vstav3:entryPoint class="PostDeploymentAction.CopyWordDocument">
          <assemblyIdentity name="PostDeploymentAction"
                            version="1.0.0.0" language="neutral"
                            processorArchitecture="msil" />
        </vstav3:entryPoint>
      </vstav3:postAction>
    </vstav3:postActions>
  5. 保存您对应用程序清单所做的更改,并关闭此文件。

  6. 在 Windows 资源管理器中,导航到包含 MyFabrikamWordDocument 项目的文件夹。

  7. 将 MyFabrikamWordDocument_TemporaryKey.pfx 文件复制到发布文件夹中的 Application Files\MyFabrikamWordDocument_1_0_0_0 文件夹中。此文件是由 Visual Studio 创建的临时证书。在将解决方案部署到生产环境中时,您应使用从证书颁发机构处获得的证书。

  8. 打开 Visual Studio 命令提示符。

  9. 更改为 Application Files\MyFabrikamWordDocument_1_0_0_0 文件夹。

  10. 在一个行上输入以下命令以重新签署应用程序清单。
    mage -sign MyFabrikamWordDocument.dll.manifest -certfile MyFabrikamWordDocument_TemporaryKey.pfx

  11. 将显示以下消息:"已成功签署 MyFabrikamWordDocument.dll.manifest"。

  12. 更改为发布文件夹。

  13. 在一个行上输入以下命令以更新并重新签署部署清单。
    mage -update MyFabrikamWordDocument.vsto -appmanifest "Application Files\MyFabrikamWordDocument_1_0_0_0\MyFabrikamWordDocument.dll.manifest" -certfile "Application Files\MyFabrikamWordDocument_1_0_0_0\MyFabrikamWordDocument_TemporaryKey.pfx"

  14. 将显示以下消息:"已成功签署 MyFabrikamWordDocument.vsto"。

  15. 在 Windows 资源管理器中,将 MyFabrikamWordDocument.vsto 文件从发布文件夹复制到 \MyFabrikamWordDocument_1_0_0_0 文件夹中。

  1. 在 Windows 资源管理器中,导航到发布文件夹。

  2. 双击 Setup.exe。这将显示"Microsoft Office 自定义项安装程序"对话框。

    图 4. 正在安装自定义项


    安装自定义项

  3. 如果您收到"无法验证发行者"警告,请单击"安装"以继续。

    图 5. 如果无法验证发行者,则 ClickOnce 会向您发出警告


    ClickOnce 警告

  4. 在该对话框告知您已成功安装自定义项时单击"关闭"。

  5. 导航到桌面,并确认已显示 MyFabrikamWordDocument.docx 文件。

  6. 打开该文档并确认自定义项已运行。

  7. 关闭该文档。

  8. 从 Windows"开始"菜单,打开"控制面板"并选择"程序和功能"。

  9. 选择 MyFabrikamWordDocument 图标,然后单击"卸载"。

  10. 如果您面向的是 .NET Framework 3.5,则请导航到桌面并确认已删除文档。

  11. 如果您面向的是 .NET Framework 4,则请导航到桌面并删除文档。

读取

将 Word 文档或 Excel 工作簿复制到用户计算机是部署后操作的一个简单示例。然而,它却是最有用的示例之一。自定义项程序集在没有其所属的文档或工作簿的情况下没什么用处。默认情况下,ClickOnce 可以很好地安装自定义项程序集。现在,您可执行相应步骤以使用部署后操作安装文档或工作簿。

在安装、更新或卸载应用程序时,添加到 Execute 方法的代码将运行。这将使您能够编写更复杂的逻辑并执行更相关的操作。Office 解决方案可能会使用本地 SQL Server Express 数据库。您可创建一个部署后操作,此操作将创建数据库并在其中填充特定信息。或者,当用户安装解决方案时,您的操作将从数据库中删除测试数据;并且,当用户更新解决方案时,您的操作将对数据库进行备份。

如果您使用 Windows Installer 生成安装程序应用程序,则您可能已熟悉如何创建在安装期间运行的自定义操作。利用在此处学到的方法,您可以使用在利用 ClickOnce 部署 Office 解决方案时使用的相同功能。

观看

观看视频

观看视频(该链接可能指向英文页面)

视频时长:08:42

文件大小:18.7 MB WMV

单击以获取代码  

获取代码(该链接可能指向英文页面)

浏览

关于作者

Robert Green 是一名开发人员、作者和培训师。他是 MCW Technologies(该链接可能指向英文页面) 的高级顾问。Robert 既是 Visual Studio Tools for the Office system MVP,又是面向 Microsoft Visual Basic、Microsoft Visual C#、LINQ 和 Microsoft Windows Workflow Foundation 的 AppDev 课件的共同制作者。在加入 MCW 之前,Robert 是 Microsoft 的产品经理和程序经理。