我制作了一个使用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>
答案 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>