使用WiX安装程序包含dll文件

时间:2019-05-14 19:33:03

标签: c# winforms dll wix ghostscript

我制作了一个使用Ghostscript库的C#winforms应用程序,并构建了wix msi安装程序以将其下载到任何计算机上。在winforms应用程序本身中,我将Ghostscript.NET.dll(用于gs库/ dll的c#包装器)和gsdll32.dll(32位本机库)设置为资源文件。我建立了一个wix项目(创建wixattempt2.msi),将应用程序和dll文件安装到Programs(x86)文件夹中,并在开始菜单上显示该应用程序。然后,我构建了wix引导程序(创建POD_Installer.exe)捆绑包,以便可以运行安装程序(wixattempt2.msi)并在需要时安装NetFx461Redist软件包。

当我运行POD_Installer.exe时,我设置为install的组件会一起存放在正确的文件夹中。但是,当我开始使用Winforms应用程序时遇到了问题。当我进入使用ghostscript的应用程序部分时,出现一条错误消息,提示“找不到ghostscript本机库”。当我展开该消息时,它将显示除gsdll32.dll以外的所有正在安装的组件。我对wix项目进行了哪些更改,所以没有任何问题?

这是wixattempt2.msi:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="POD" Language="1033" Version="1.0.0.0" Manufacturer="POD" UpgradeCode="PUT-GUID-HERE">
        <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <Icon Id="Ruler.ico" SourceFile="Ruler.ico"/>
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />
    <Directory Id="TARGETDIR" Name="SourceDir">
      <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLFOLDER" Name="POD" />
      </Directory>
      <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="POD"/>
      </Directory>
    </Directory> 

    <DirectoryRef Id="INSTALLFOLDER">
      <Component Id="_6lumber.exe" Guid="*">
        <File Id="_6lumber.exe" Source="POD.exe" KeyPath="yes" Checksum="yes"/>
      </Component>
            <Component Id="_notepadcalc.exe" Guid="*">
        <File Id="_notepadcalc.exe" Source="notepadcalc2.exe" KeyPath="yes" Checksum="yes"/>
      </Component>
      <Component Id="Erics_takeoff_103118.xlsx" Guid="*">
        <File Id="Erics_takeoff_103118.xlsx" Source="Erics_takeoff_103118.xlsx" KeyPath="yes"/>
      </Component>
      <Component Id="gs.dll" Guid="*" >
        <File Id="gs.dll" Source="gsdll32.dll" KeyPath="yes"/>
      </Component>
      <Component Id="gsnet.dll" Guid="*">
        <File Id="gsnet.dll" Source="Ghostscript.NET.dll" KeyPath="yes"/>
      </Component>
    </DirectoryRef>
    <DirectoryRef Id="ApplicationProgramsFolder">
      <Component Id="ApplicationShortcut" Guid="*">
        <Shortcut Id="ApplicationStartMenuShortcut"
                  Name="POD" Icon="Ruler.ico"
                  Description="My Application Description"
                  Target="[#_6lumber.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>
        <Shortcut Id="ApplicationStartMenu"
                  Name="POD_CAD" Icon="Ruler.ico"
                  Description="My Application Description"
                  Target="[#_notepadcalc.exe]"
                  WorkingDirectory="INSTALLFOLDER"/>

        <RemoveFolder Id="CleanUpShortCut" Directory="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\Microsoft\POD" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
      </Component>
    </DirectoryRef>

        <Feature Id="POD" Title="POD" Level="1">
            <ComponentRef Id="gs.dll"/>
      <ComponentRef Id="gsnet.dll"/>
            <ComponentRef Id="_6lumber.exe" />
      <ComponentRef Id="_notepadcalc.exe"/>
      <ComponentRef Id="Erics_takeoff_103118.xlsx"/>
      <ComponentRef Id="ApplicationShortcut"/>
        </Feature>
    </Product>  

</Wix>

编辑:引导程序制作POD_Installer.exe

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:bal="http://schemas.microsoft.com/wix/BalExtension">
    <Bundle Name="POD_Installer" Version="1.0.0.0" Manufacturer="POD" UpgradeCode="732da7cb-f953-4cfd-af6e-5c25db16b47c">
        <BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">
      <bal:WixStandardBootstrapperApplication
        LogoFile="Resources\custom_icon_design_flatastic_10_ruler-3.png"
        LicenseFile="Resources\mylittlelicense.rtf"
        />
    </BootstrapperApplicationRef>
    <PayloadGroup Id="NetFx461RedistPayload" >
      <Payload Name="redist\NDP461-KB3102436-x86-x64-AllOS-ENU.exe"
               SourceFile="Resources\NDP461-KB3102436-x86-x64-AllOS-ENU.exe" />
    </PayloadGroup>
        <Chain>
            <!-- TODO: Define the list of chained packages. -->
            <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
      <PackageGroupRef Id="NetFx461Web"/>
      <MsiPackage Id="POD_Measuring_Tool" SourceFile="C:\Users\Admin\source\repos\wixattempt2\wixattempt2\bin\Debug\wixattempt2.msi"
                  Cache="yes" ForcePerMachine ="yes"/>

    </Chain>        
    </Bundle>
</Wix>

1 个答案:

答案 0 :(得分:0)

Administrative Installation:我们首先需要确定您提到的文件是否实际上在MSI中。让我们进行MSI的管理员安装-精美的文件提取。在 cmd.exe (命令提示符)中,请运行以下命令:

msiexec.exe /a "Setup.msi"

有关更多详细信息,请参见此答案:Administrative Installation。现在,检查您引用的文件是否在提取文件夹中。我们要从那里拿走吗?

不匹配 :源代码中的文件名与Component和File ID之间不匹配,这没关系,因为您在其他地方正确引用了它,但您可能要同步它:

<Component Id="gs.dll" Guid="PUT-GUID-HERE" >
  <File Id="gs.dll" Source="gsdll32.dll" KeyPath="yes"/>
</Component>