如何使用 WIX 打包 VSTO Word 插件以进行部署(到 Office 32 位)?

How do you package a VSTO Word addin for deployment (to Office 32 bit) using WIX?

我在 VS 2017 Pro 中开发了一个 VSTO Word add in。工作正常,准备部署。但是,我找不到一个工作程序来打包我的 VSTO Word add in 以便在我的开发机器以外的机器上使用。对于任何特定的机器,我需要部署一次并让任何可能使用他们的帐户登录的用户都可以使用它。

第一次遇到 this,但它涉及使用 InstallShield Limited Edition,它显然不再适用于 VS 2017。

试过 this 但它的一些步骤似乎缺少部分或者说 "do x" 没有解释如何。

尝试了 'InnoSetup' 和 'bovendor/VstoAddinInstaller',但是遵循 'bovendor' 过程导致 'Innosetup' 编译器抛出错误(bovender 口述的节缺少必需的元素)。无法得到 bovendor 的回复。

搜索了 Microsoft 文档,但找不到程序。任何人都可以提供打包 VSTO Word 加载项以进行部署的过程吗?

更新 使用 WiX 工具集成功打包和部署了我的插件。请参阅下面我的回答

我通常在Visual Studio中使用Click-Once deployment。您可以将其部署到网络路径,以便其他用户能够安装它。

首先,您要为 Visual Studio 个项目创建一个不会过期的证书

在“开始”菜单搜索中键入 Developer Command 并单击鼠标右键,然后 select 运行 以管理员身份

MakeCert and pvk2pfx

的命令提示符中粘贴以下命令
MakeCert /n "CN=Your New Cert" /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e "01/01/2100" /sv MyNewCert.pvk MyNewCert.cer 
pvk2pfx -pvk MyNewCert.pvk -spc MyNewCert.cer -pfx MyNewCert.pfx

注:

  • 日期格式为美国标准MM/DD/YYYY
  • 可以在 pvk2pfx 行末尾使用 -f 参数来覆盖现有文件
  • 系统会提示您创建密码(这是可选的)

密码提示后,您需要 运行 第二个命令行,只需按 Enter 键即可。

现在您可以 select 多个 Visual Studio 项目使用同一个证书

在Visual Studio项目属性中,select签名*从文件中点击Select.... 从命令提示符和 select 证书文件 (*.pfx)

导航到同一路径

发布项目

然后转到项目属性中的发布 选项卡并单击立即发布。它将在发布的位置创建一个可执行文件。然后你只需要将 link 发送到 .exe 文件给你的最终用户。

更新 (11/26/2019):如果您的设置使用 64 位 Office,请参阅 How do you package a VSTO Word addin for deployment to a 64-bit Windows 10 machine running Microsoft Office 64 bit using WIX?

使用 WiX 工具集

成功打包并部署了我的 add-in

信用:我通过 Pieter van der Westhuizen's example on the Add-in Express Blog.

学到了大部分内容

我在我的开发机器(64 位)上使用 Visual Studio Pro 2017.NET 4.6.1C# 来实现我的 VSTO Word 加载项.

我的要求是将 add-in 部署一次到 64 位生产机器(即 Citrix 虚拟桌面主映像),以便登录到生产机器(即日志到基于主映像的虚拟桌面上)。主映像上安装了 32 位版本的 Word 2013。

据我了解,这意味着 'add-in' 必须安装在 'C:\Program Files (x86)' 下,原因有两个:

  1. 所以所有用户都可以访问加载项,并且
  2. 在 (x86) 下,因为它是 Word 的 32 位版本。

此外,由于所有用户都需要访问 add-in,因此所需的 VSTO 注册表项设置位于根目录 HKLM 下(而不是 HKCU)。本质上,此 'all users' 设置与 'one user' Click-Once 设置相反。无缘无故,我在一个没有连接到 Internet 的飞地中。所以,我用的所有软件都是从别处下载的,然后带进飞地安装到本地。

我的 VSTO word 加载项(即 C:\....\Visual Studio 2017\Projects\FooAddIn\FooAddIn\bin\Release 中)的发布文件是:

  • FooAddIn.dll
  • FooAddIn.dll.清单
  • FooAddIn.vsto
  • Microsoft.Office.Tools.Common.v4.0.Utilities.dll

我做了什么

  • 已从 http://wixtoolset.org/releases/ 下载并安装 'WiX' v3.11.1 到我的开发机器上。

  • https://marketplace.visualstudio.com/items?itemName=RobMensching.WixToolsetVisualStudio2017Extension

  • 下载并安装 'Wix Toolset Visual Studio 2017 Extension' 到我的开发机器上
  • 使用 VS 2017 打开了我的 add-in 项目 FooAddIn,在 Solution Explorer 中,用鼠标右键单击顶行 Solution 节点并单击 Add -> New Project

  • Add New Project 对话框中,单击 WiX Toolset 下的 v3,然后单击 Setup Project for WiX v3。我将新项目命名为 FooAddInSetup。 Visual Studio Solution Explorer 显示 Solution FooAddIn (2 projects)、项目 FooAddIn 和项目 FooAddInSetup

  • FooAddInSetup -> References 下,添加了对 C:\Program Files (x86)\WiX Toolset v3.11\bin\WixNetFxExtension.dllC:\Program Files (x86)\WiX Toolset v3.11\bin\WixUIExtension.dll 的引用(Product.wxs 文件的元素需要这些来构建安装程序) .

  • 配置 VS 以同时构建安装程序:在 VS 中,单击“构建”->“配置管理器”。在“配置管理器”对话框中,选中 FooAddInSetup 的 Build 复选框。

  • 创建了EULA.rtf(我说的是"This is license-free software")并将其放在C:....\Visual Studio 2017\Projects\FooAddIn\FooAddInSetup

  • 为我的 VSTO 发布文件所在位置的路径创建了预处理器变量:在解决方案资源管理器中,单击鼠标右键 FooAddInSetup -> Properties。在 FooAddInSetup 选项卡上,单击 'Build'。在 General 部分,单击 Define 'Debug' preprocessor variable。在 Define preprocessor variables: 文本框中,输入 AddinFiles=..\FooAddIn\bin$(Configuration)\

  • 为我的 add-in 填充样板 WiX Product.wxs 文件,如下所示 Product.wxs 文件

  • 注意:在 wxs 文件中,我修改了 Condition 元素中的 Visual Studio 2010 Tools for Office Runtime 超链接 - Pieter 示例中的超链接已失效。

  • 我将解决方案配置设置为 Release 并构建了解决方案。

  • 已将 FooAddInSetup.msi 从我的开发机器上的 ...\FooAddInSetup\bin\release 复制到我的生产机器(VDI 主机)和 运行 安装程序作为管理员。

结果

  1. 不考虑我在 wxs 文件中声明的注册表设置,我的注册表项是在 HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\Office\Word\AddIns\LesCaveatAddIn 中创建的,即它们按预期进入了 HKLM,但它们进入 \Software\Wow6432Node\Microsoft..... 而不是我在 wxs 文件中编码的 \Software\Microsoft.... 。我认为这是因为我的生产机器是 64 位机器。

  2. 正如预期的那样,加载项本身安装在 c:\program files (x86)

  3. 调出 Word,加载项按预期加载

Product.wxs 文件

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">

  <!--
  The boilerplate Product.wxs file already contains the minimum amount of elements needed to build a WiX installer. 
  If the Product element, Id attribute is set to an asterisk (*), WiX will generate a new GUID every time the setup project is compiled (I left it as-is). 
  Change the Name attribute value and Manufacturer attribute value to values of your choice.
  -->
  <Product Id="*"
           Name="FOO Add-In"
           Language="1033"
           Version="1.0.0.0"
           Manufacturer="Foo Masters"
           UpgradeCode="4b35cc09-4780-4644-a7d4-f5901f7a7e45">

    <!--Attributes shown are the minimum number needed to build the setup project.-->
    <Package InstallerVersion="200"
             Compressed="yes"
             InstallScope="perMachine" />

    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />

    <!-- Verify if VSTO Office Runtime is installed -->
    <Property Id="VSTORUNTIMEREDIST">
      <RegistrySearch
        Id="VSTORuntimeRedist"
        Root="HKLM"
        Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R"
        Name="Version"
        Type="raw" />
    </Property>

    <Condition
      Message="The Visual Studio 2010 Tools for Office Runtime is not installed. 
  Please download and install from https://www.microsoft.com/en-us/download/details.aspx?id=48217.">
      <![CDATA[Installed OR VSTORUNTIMEREDIST>="10.0.30319"]]>
    </Condition>

    <!-- Verify if .NET Framework is installed -->
    <PropertyRef Id="NETFRAMEWORK40FULL"/>
    <Condition Message="This application requires .NET Framework 4.0.">
      <![CDATA[Installed OR NETFRAMEWORK40FULL]]>
    </Condition>

    <!--I want one Cab file, so only one Media element is needed. Make sure the EmbedCab attribute value is "yes".-->
    <Media Id="1" Cabinet="FooAddin.cab" EmbedCab="yes"/>

    <!--Set values for display on setup progeam UI-->
    <Feature Id="ProductFeature" Title="FOO Add-In" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentRef Id="Registry_FriendlyName" />
      <ComponentRef Id="Registry_Description" />
      <ComponentRef Id="Registry_Manifest" />
      <ComponentRef Id="Registry_LoadBehavior" />
    </Feature>

    <!--Specify that the WiXUI_Minimal UI should be used, i.e, the simplest UI available -->
    <UIRef Id="WixUI_Minimal" />

    <!--Specify the EULA file to use-->
    <WixVariable Id="WixUILicenseRtf" Value="EULA.rtf" />

  </Product>

  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="FooAddin" />

        <!-- Add required VSTO registry entries for 32-bit Word -->
        <!-- see https://docs.microsoft.com/en-us/visualstudio/vsto/registry-entries-for-vsto-add-ins?view=vs-2019-->

        <Component Id="Registry_FriendlyName">
          <RegistryValue Id="RegKey_FriendlyName" Root="HKLM"
                         Key="Software\Microsoft\Office\Word\AddIns\FooAddin"
                         Name="FriendlyName"
                         Value="FOO Add-In"
                         Type="string" KeyPath="yes" />
        </Component>
        <Component Id="Registry_Description">
          <RegistryValue Id="RegKey_Description" Root="HKLM"
                         Key="Software\Microsoft\Office\Word\AddIns\FooAddin"
                         Name="Description"
                         Value="FOO Add-In"
                         Type="string" KeyPath="yes" />
        </Component>
        <Component Id="Registry_Manifest">
          <RegistryValue Id="RegKey_Manifest" Root="HKLM"
                         Key="Software\Microsoft\Office\Word\AddIns\FooAddin"
                         Name="Manifest" Value="[INSTALLFOLDER]FooAddin.vsto|vstolocal"
                         Type="string" KeyPath="yes" />
        </Component>
        <Component Id="Registry_LoadBehavior">
          <RegistryValue Id="RegKey_LoadBehavior" Root="HKLM"
                         Key="Software\Microsoft\Office\Word\AddIns\FooAddin"
                         Name="LoadBehavior" Value="3"
                         Type="integer" KeyPath="yes" />
        </Component>

      </Directory>
    </Directory>
  </Fragment>

  <Fragment>

    <!-- Add refs to the components of the VSTO-->

    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">

      <Component Id="MSOfficeToolsCommon_dll_Component">
        <File Id="MSOfficeToolsCommon_dll" KeyPath="yes"
          Name="Microsoft.Office.Tools.Common.v4.0.Utilities.dll"
          Source="$(var.AddinFiles)"></File>
      </Component>

      <Component Id="FooAddin_dll_Component" >
        <File Id="FooAddin_dll" KeyPath="yes"
              Name="FooAddin.dll"
              Source="$(var.AddinFiles)" />
      </Component>

      <Component Id="FooAddin_vsto_Component">
        <File Id="FooAddin_vsto" KeyPath="yes"
          Name="FooAddin.vsto"
          Source="$(var.AddinFiles)"></File>
      </Component>

      <Component Id="FooAddin_dll_manifest_Component">
        <File Id="FooAddin_dll_manifest" KeyPath="yes"
          Name="FooAddin.dll.manifest"
          Source="$(var.AddinFiles)"></File>
      </Component>

    </ComponentGroup>
  </Fragment>
</Wix>