使用VS2019和WiX创建VSTO MSI安装

时间:2019-10-25 10:36:18

标签: wix windows-installer vsto visual-studio-2019 office-addins

我不是常规的VS开发人员

我有一个VS2010项目,可为Outlook创建VSTO加载项并使用Click-Once安装

尽管即使在最新的Office 365上仍然可以使用,但VS2010现在已经步履维艰,并且“单击一次”方法多年来困扰着我,我现在想创建MSI版本的安装程序。

我已经与WiX一起安装了VS2019社区,我已经将项目的副本转换为VS2019,但它似乎仍在运行

我已经阅读了许多有关创建WiX的网页,但是它们要么已经很旧,要么对我来说不够详细。

我想我要做的是有点不寻常,因为我想使用最新的VS与.NET4和VSTO2010创建VSTO插件MSI。

虽然我已经掌握了所需的工具,但细节还是很棘手,除非确定版本/路径/ reg条目/依赖项等完全正确,否则我确信它不会起作用

安装程序具有DotNetFX40Client VSTOR40 WindowsInstaller3_1的文件夹时,我当前单击的按钮

在此处https://jsfiddle.net/j4bu6923/3/

使用信息

我不太清楚要插入什么XML条目,如果缺少某些东西如何安装它,我也看到过Office2007等的检查,但是我不知道如何将其绑定到特定的Office版本。即,现在它仍然可以在O365中使用

很抱歉出现混乱的帖子,但显然单击一次清单中有很多信息,但我不太确定如何从那里转到工作的msi安装程序

例如在VS2019中调试和发行版都重建了项目,例如,看起来好像安装程序需要的那些obj文件夹中没有清单文件

所有这些都是错误的,“单击一次”仅是工作室中的几次单击,它会为您整理其余部分

希望那里有一个假人指南...甚至一个假人指南!

谢谢

1 个答案:

答案 0 :(得分:1)

VSTO 2010是运行时的最新版本。不过,您可以将项目更新为更高版本的.NET Framework。

您无需在安装程序中包含完整的VSTO 2010可再发行组件。以我的经验,如果仅将目标文件夹中的运行时程序集包括在安装程序包中,则外接程序运行得很好。

您声明无法在obj文件夹中找到清单文件。但是,在成功编译加载项之后,您应该至少在目标文件夹中找到加载项的dll,其vsto文件,清单和所有引用的dll。您将需要在安装程序中包括所有这些文件。如果找不到它们,则说明您在错误的文件夹中搜索,或者在编译过程中发生了错误。

维护和开发WiX工具集的团队做得很好。但是,WiX的文档没有跟上该工具集。另外,有关创建WiX安装脚本的许多问题实际上是有关Windows Installer本身的功能以及在特定情况下需要执行的操作的问题。这就是为什么提出一个可行的解决方案可能很繁琐的原因。

在下文中,我将为您提供我提出的安装脚本的结构示例。请注意,由于我实际上没有运行此脚本,可能会有一些错别字。除此之外,应该没问题。我将这种脚本与WiX工具集3.12版一起使用来安装PowerPoint加载项。请确保您在WiX项目中引用WixUiExtension和WixUtilExtension。您是否还想使用其他功能,请参考WixNetFXExtensions。仅当您创建自定义操作时,某些高级功能才可用。为了简单和通用起见,在此未将它们包括在内。

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <?if $(var.Platform) = x64 ?>
  <?define Win64 = "yes" ?>
  <?define PlatformProgramFilesFolder = "ProgramFiles64Folder" ?>
  <?else ?>
  <?define Win64 = "no" ?>
  <?define PlatformProgramFilesFolder = "ProgramFilesFolder" ?>
  <?endif ?>
  <?define YOUR_PROJECT_TargetDir=$(var.YOUR_PROJECT.TargetDir)?>
  <Product Id="*" Name="YOUR_PRODUCT_NAME" Language="1033" Version="YOUR_VERSION_NUMBER" Manufacturer="YOUR_MANUFACTURER_NAME" UpgradeCode="6DC92DB3-AA62-4C13-95E0-45C06AADDB32">
    <Package InstallerVersion="500" Compressed="yes" Platform="x64" InstallScope="perMachine"/>
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate EmbedCab="yes"/>
    <Feature Id="ProductFeature" Title="YOUR_FEATURE_TITLE" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentRef Id="RegistryEntries"/>      
    </Feature>
    <Icon Id="ProductIcon" SourceFile="$(var.ProjectDir)NAME_OF_YOUR_PRODUCT_ICON.ico"/>
    <Property Id="ARPPRODUCTICON" Value="ProductIcon"/>
    <WixVariable Id="WixUIBannerBmp" Value="$(var.ProjectDir)NAME_OF_YOUR_BANNER.bmp"/>
    <WixVariable Id="WixUIDialogBmp" Value="$(var.ProjectDir)NAME_OF_YOUR_BACKGROUND.bmp"/>
    <UIRef Id="WixUI_Minimal" />
    <PropertyRef Id="WIX_ACCOUNT_USERS" />
  </Product>  
  <Fragment>
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="$(var.PlatformProgramFilesFolder)">
        <Directory Id="MANUFACTURERFOLDER" Name="!(bind.property.Manufacturer)" >
          <Directory Id="INSTALLFOLDER" Name="!(bind.property.ProductName)" />
        </Directory>
      </Directory>      
    </Directory>
  </Fragment>
  <Fragment>
    <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
      <Component Id="NAME_OF_YOUR_DLL.dll" Guid="1E9A1682-0F62-4CDF-A0C9-6D86B6950E26">
        <File Id="NAME_OF_YOUR_DLL.dll" Name="NAME_OF_YOUR_DLL.dll" Source="$(var.YOUR_PROJECT_TargetDir)NAME_OF_YOUR_DLL.dll" />
      </Component>
      <Component Id="NAME_OF_YOUR_MANIFEST.dll.manifest" Guid="736F51B1-5B1F-49DA-976E-33EE4C5C8AC0">
        <File Id="NAME_OF_YOUR_MANIFEST.dll.manifest" Name="NAME_OF_YOUR_MANIFEST.dll.manifest" Source="$(var.YOUR_PROJECT_TargetDir)NAME_OF_YOUR_MANIFEST.dll.manifest" />
      </Component>
      <Component Id="NAME_OF_YOUR_VSTO_FILE.vsto" Guid="12D44F21-62A4-4B8E-B018-3B9B325512C1">
        <File Id="NAME_OF_YOUR_VSTO_FILE.vsto" Name="NAME_OF_YOUR_VSTO_FILE.vsto" Source="$(var.YOUR_PROJECT_TargetDir)NAME_OF_YOUR_VSTO_FILE.vsto" />
      </Component>      
    </ComponentGroup>
  </Fragment>  
  <Fragment>
    <DirectoryRef Id="TARGETDIR">
      <Component Id="RegistryEntries" Guid="A495FAB3-8440-4357-83F7-D1F4EABAA06A" Win64="$(var.Win64)">
        <RegistryKey Root="HKLM" Key="Software\Microsoft\Office\Outlook\AddIns\!(bind.property.ProductName)">
          <RegistryValue Id="Description" Type="string" Name="Description" Value="!(bind.property.ProductName)" />
          <RegistryValue Id="FriendlyName" Type="string" Name="FriendlyName" Value="!(bind.property.ProductName)" />
          <RegistryValue Id="LoadBehavior" Type="integer" Name="LoadBehavior" Value="3"/>
          <RegistryValue Id="Manifest" Type="string" Name="Manifest" Value="[#NAME_OF_YOUR_VSTO_FILE.vsto]|vstolocal" KeyPath="yes"/>
        </RegistryKey>        
      </Component>
    </DirectoryRef>
  </Fragment>
</Wix>

请让我知道是否还有其他问题。