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

2024-03-05

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

第一次遇到this https://learn.microsoft.com/en-us/visualstudio/vsto/deploying-an-office-solution-by-using-windows-installer?view=vs-2017#Obtain,但它涉及使用 InstallShield Limited Edition,该版本显然不再适用于 VS 2017。

Tried this https://learn.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2010/ff937654(v=msdn.10)但它的一些步骤似乎缺少部分或说“做x”而没有解释如何做。

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

已搜索Microsoft文档,只是找不到程序。谁能提供打包 VSTO Word 加载项以进行部署的过程?

Update使用 WiX 工具集成功打包和部署我的加载项。请参阅下面我的回答


更新(2019 年 11 月 26 日):如果您的设置使用 64 位 Office,请参阅如何使用 WIX 打包 VSTO Word 插件以部署到运行 Microsoft Office 64 位的 64 位 Windows 10 计算机? https://stackoverflow.com/questions/58629128/how-do-you-package-a-vsto-word-addin-for-deployment-to-a-64-bit-windows-10-machi

成功打包并部署我的add-in使用WiX工具组

信用:我学到了大部分内容Pieter van der Westhuizen 的例子 https://www.add-in-express.com/creating-addins-blog/2012/11/13/wix-installation-vsto-office-addin/ on the 插件 Express 博客 https://www.add-in-express.com/creating-addins-blog/.

I used Visual Studio Pro 2017, .NET 4.6.1, and C#在我的开发机器(64位)上实现我的VSTO Word add-in.

我的要求是部署add-in一次到 64 位生产计算机(即 Citrix 虚拟桌面主映像),因此登录到生产计算机的任何用户都可以使用它(即登录到基于主映像的虚拟桌面)。 32 位版本的 Word 2013 安装在主映像上。

据我了解,这意味着“加载项”必须安装在“C:\Program Files (x86)”下,原因有两个:

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

此外,由于所有用户都需要访问add-in, 所需VSTO注册表项设置位于根目录下HKLM(并不是HKCU)。本质上,这种“所有用户”设置与“一个用户”设置相反Click-Once设置。毫无疑问,我处于一个未连接到互联网的飞地。所以,我使用的所有软件都是从其他地方下载的,然后携带到飞地并在本地安装。

我的发布文件VSTO单词插件(即,在C:\....\Visual Studio 2017\Projects\FooAddIn\FooAddIn\bin\Release) are:

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

我做了什么

  • 从以下位置下载“WiX”v3.11.1 并将其安装到我的开发机器上http://wixtoolset.org/releases/ http://wixtoolset.org/releases/.

  • 从以下位置将“Wix Toolset Visual Studio 2017 Extension”下载并安装到我的开发计算机上https://marketplace.visualstudio.com/items?itemName=RobMensching.WixToolsetVisualStudio2017Extension https://marketplace.visualstudio.com/items?itemName=RobMensching.WixToolsetVisualStudio2017Extension

  • 打开我的add-in项目FooAddIn using VS 2017 and in Solution Explorer, 鼠标右键单击顶行Solution节点并单击Add -> New Project.

  • In the Add New Project对话框,点击v3 under WiX Toolset然后点击Setup Project for WiX v3。我将新项目命名为FooAddInSetup。视觉工作室Solution Explorer shows Solution FooAddIn (2 projects), 项目FooAddIn,以及项目FooAddInSetup.

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

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

  • Created EULA.rtf(我的说“这是免许可软件”)并将其放置在 C:....\Visual Studio 2017\Projects\FooAddIn\FooAddInSetup 中

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

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

  • 注:在wxs文件,我修改了Visual Studio 2010 Tools for Office Runtime中的超链接Condition元素 - 彼得例子中的元素已经死了。

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

  • Copied FooAddInSetup.msi from ...\FooAddInSetup\bin\release在我的开发机器上连接到我的生产机器(VDI master)并以管理员身份运行安装程序。

Results

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

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

  3. 启动 Word,加载项已按预期加载

产品.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://learn.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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 如何使用 C# 从 IIS 获取当前的 Worker Request 列表?

    我正在为 RESTful Web 服务状态页面编写代码 我想知道是否有办法将当前请求从 IIS 获取到 C 中 我正在使用 IIS 7 0 我想要的信息在下面 IIS gt 工作进程 gt ASP NET v4 0 gt 请求 您可以使用G
  • 无法在 Azure Function v2 中加载文件或程序集“System.Private.ServiceModel”

    我使用了 v2 azure 函数 持久函数 和调用服务的自定义 dll net core 2 2 但出现以下异常 无法加载文件或程序集 System Private ServiceModel 版本 4 1 2 4 文化 中性 PublicK
  • android中imageView的单击和双击的区别

    我尝试过以下代码来区分单击和双击 单击一下就可以了 当我双击图像视图时 单击和双击部分内的代码都会执行 private static final long DOUBLE PRESS INTERVAL 250 in millis privat
  • 数据进入错误的工作簿

    我有一个编码为从中收集信息并将数据传输到摘要工作簿的工作簿 该代码在收集数据时有效 但它将数据打印到从中收集数据的工作簿 而不是摘要工作簿 这很奇怪 因为它打开摘要工作簿 甚至计算行数 因此数据将转到第一个空行 有人可以告诉我我做错了什么吗
  • Netbeans 中 try-catch Logger 的自定义代码片段

    每次我使用灯泡提示在 Netbeans 中添加 try catch 块时 它都会自动添加以下行 import java util logging Level import java util logging Logger catch Log
  • gradle build Javadoc 任务因“未知标签:attr”而失败

    我正在尝试建立android autofittextview https github com grantland android autofittextview使用 gradle 从命令行进行项目 然而 每次都失败并出现以下错误 User
  • 列表列表中是否存在某个元素?

    我想查找给定元素是否存在于列表列表中 只有当该元素存在于列表的第一个列表中的某处时 我才得到正确的结果 有什么建议吗 memberlist X X T1 T2 memberlist X H T1 T2 memberlist X T1 T2
  • Backbone.js html 选择/单选更改事件未触发,但单击事件是

    我正在学习骨干 但我一直坚持为 html 选项元素绑定 onchange 事件 我尝试使用 change 或 change id 进行绑定 但这些都没有触发 但是 click 和 click id 事件都有效 div div
  • 如何将命名空间感知设置为 false?

    我正在尝试使用 EclipseLink MOXy 解析一些 XML 但它失败了xsi属性 如果我删除它 它解析得很好 然而 我有 100GiB 的 XML 需要费力地浏览 并且无法更改源文件 有人建议如果我可以设置XmlParser set
  • 将基于标签栏的 iPhone 项目迁移到 iPad

    像许多其他开发人员一样 我创建了使用UITabBarController作为根控制器 选项卡视图使用UINavigationController从列表深入到详细视图 和许多其他开发人员一样 我需要将这些应用程序迁移到 iPad 以便它们利用
  • OCaml 是否复制了自定义块?

    想象一下 我有一个名为 libcat 的 C 库 用于与我的毛茸茸的猫进行交互 因此 我正在为 OCaml 编写绑定来简化与 fluffy 的交互 module type CAT sig type cat val find gt cat v
  • Ansible 模板中的 For 循环

    我有问题 我在模板文件中使用 for for vhost in item server vhost endfor 与项目一起使用文件 yml ansible 中的 with items 但出出是 server d server o serv
  • aspnet 表 - 指定 TableCell 宽度?

    我有一个 asp net 表 我试图将我的列格式化为所有相同的宽度 或者说 4 列分别为 20 30 20 和 30 但是以下代码不起作用
  • android:在imageview中拉伸图像以适合屏幕

    我有一个imageview其高度和宽度设置为fill parent with a linearlayout具有相同的值集 所以我想这应该设置我的图像以适合屏幕 但它只适合 80 横向模式下的顶部和底部边距 我尝试了以下代码但没有成功 Dis
  • 将 textPath 方向从逆时针翻转为顺时针?

    默认情况下 SVG 以逆时针方式将文本环绕路径 文本的天花板粘住了路径 如何将方向更改为顺时针 以使文本的地板粘在圆周上而不是天花板上 textspace letter spacing 5px font family fantasy fon
  • 在 android 和 windows 中使用 sha1prng 给出不同的序列

    我在我的android程序和java程序中都使用了sha1prng作为伪随机数生成器算法 我给它们都设置了相同的值 但是android中生成的序列和java中生成的序列不一样 为什么会发生这种情况 解决这个问题的方法是什么 我认为这是因为
  • 如何使用 ActionCable 作为 API

    我使用 Rails 5 beta 1 和 ActionCable 构建了一个非常简单的应用程序 用于显示用户何时上线并让他们互相发送消息 现在 我基本上想采用 ActionCable 的客户端部分 在另一个应用程序的上下文中实现它 这确实n
  • 将身份添加到现有项目

    我有一个 MVC 项目 我想向其中添加 Identity 但我似乎找不到任何关于如何执行此操作的好文章 有没有一种简单的方法可以将身份添加到现有项目中 我已经有一个数据库 里面有东西 好吧 在一方面 您只需添加 Nuget 包并开始用它编写
  • 在 JScrollPane 中使用绝对布局

    我需要使用具有绝对布局的 JScrollPane 我知道根本不推荐使用 setLayout null 我一直在读到 如果您想在 JScrollPane 中使用绝对布局 则必须设置内部元素的首选大小属性 以便 JScrollPane 可以计算
  • 如何使用 WIX 打包 VSTO Word 插件以进行部署(到 Office 32 位)?

    我开发了一个VSTO Word add in在 VS 2017 Pro 中 工作正常 准备部署 但是 我找不到包装我的工作程序VSTO Word add in用于我的开发机器以外的机器 对于任何特定的机器 我需要部署一次并使其可供任何可能使