Visual Studio Wix将Dotnet Framework 4.81与以前构建的msi捆绑在一起

unhi4e5o  于 2023-10-23  发布在  其他
关注(0)|答案(5)|浏览(103)

我试图构建一个安装程序,它只捆绑了Dotnet Framework 4.81和一个简单的测试应用程序。
我一直得到一个错误,说"wix.exe:错误WIX0001:System.ArgumentNullException:值不能为空。"
我创建了一个Bundle(Wix v4)项目,下面是Bundle. wxs文件。

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">
  <Bundle Name="TestBundleInstaller" Manufacturer="TODO Manufacturer" Version="1.0.0.0" UpgradeCode="d090a306-15fc-4e04-985e-83cbb3a2cf5f">
    <BootstrapperApplication>
      <bal:WixStandardBootstrapperApplication LicenseUrl="https://www.example.com/license" Theme="hyperlinkLicense" />
    </BootstrapperApplication>

    <Chain>
        <!-- TODO: Define the list of chained packages. -->
        <ExePackage DetectCondition="WIX_IS_NETFRAMEWORK_48_OR_LATER_INSTALLED" InstallArguments="/q" UninstallArguments="/q">
            <Payload SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe"/>
        </ExePackage>
        <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
        <MsiPackage SourceFile="DirectoryTo\TestSetup.msi" />
    </Chain>

  </Bundle>
</Wix>

下面是TestBundle.wixproj文件。

<Project Sdk="WixToolset.Sdk/4.0.0">
  <PropertyGroup>
    <OutputType>Bundle</OutputType>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <OutputPath>bin\x64\Debug</OutputPath>
    <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
  </PropertyGroup>
  <ItemGroup>
    <None Include="NDP481-x86-x64-AllOS-ENU.exe" />
  </ItemGroup>
  <ItemGroup>
    <PackageReference Include="WixToolset.Bal.wixext" Version="4.0.0" />
  </ItemGroup>
  <ItemGroup>
    <ProjectReference Include="..\TestSetup\TestSetup.wixproj" />
  </ItemGroup>
</Project>

阅读了许多Wix教程和文档,我仍然不理解我遇到的错误。任何帮助都非常感谢。
构建输出:
生成已开始...
1>------跳过的构建:项目:测试,配置:调试x64-
1>未选择要为此解决方案配置生成的项目
2>--跳过的构建:项目:测试设置,配置:调试x64-
2>未选择要为此解决方案配置生成的项目
3>--Build started:项目:测试包,配置:调试x64-
已恢复C:\Users\JJacobs\source\repos\TestBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBundleBund
3> wix. exe:error WIX0001:System.ArgumentNullException:值不能为空。
3>完成构建项目"TestBundle.wixproj"--FANUC。
== 0成功,1失败,0最新,2跳过=

balp4ylt

balp4ylt1#

ArgumentNullException是WiX中的一个bug。请提交一个问题:https://wixtoolset.org/docs/gethelp/#bugs

gojuced7

gojuced72#

根本问题是ExePackage需要一个SourceFile属性。在这种情况下,将Payload元素移动到ExePackage中,如下所示:

<ExePackage DetectCondition="WIX_IS_NETFRAMEWORK_48_OR_LATER_INSTALLED"
            InstallArguments="/q" UninstallArguments="/q"
            SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe" />

WiX v4 * 应该 * 将其作为错误捕获,而不是崩溃。WiX中的代码由于远程有效载荷而变得复杂。
我看到一个问题已经打开,所以它可以在WiX中得到修复。

rqmkfv5c

rqmkfv5c3#

为了完整起见,这里是新的Bundle.wxs文件。

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal">

    <Bundle Name="TestBundleInstaller" Manufacturer="TODO Manufacturer" Version="1.0.0.0" UpgradeCode="d090a306-15fc-4e04-985e-83cbb3a2cf5f">
        <BootstrapperApplication>
            <bal:WixStandardBootstrapperApplication LicenseUrl="https://www.example.com/license" Theme="hyperlinkLicense" />
        </BootstrapperApplication>
        
        <Chain>
            <!-- TODO: Define the list of chained packages. -->
            <ExePackage DetectCondition="WIX_IS_NETFRAMEWORK_481_OR_LATER_INSTALLED" InstallArguments="/norestart /q" UninstallArguments="/q"
                SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe">
                <!-- Payload SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe"/ -->
            </ExePackage>
            <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
            <MsiPackage SourceFile="DirectoryTo\TestSetup.msi"/>
        </Chain>

    </Bundle>
</Wix>
mitkmikd

mitkmikd4#

以下是如何在v4捆绑包项目中使用注册表搜索。

<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs" xmlns:bal="http://wixtoolset.org/schemas/v4/wxs/bal" xmlns:bal.util="http://wixtoolset.org/schemas/v4/wxs/util">

    <Bundle Name="TestBundleInstaller" Manufacturer="TODO Manufacturer" Version="1.0.0.0" UpgradeCode="d090a306-15fc-4e04-985e-83cbb3a2cf5f">
        <BootstrapperApplication>
            <bal:WixStandardBootstrapperApplication LicenseUrl="https://www.example.com/license" Theme="hyperlinkLicense" />
        </BootstrapperApplication>
        <bal.util:RegistrySearch
            Id="SEARCH_DOTNET_RELEASE64"
            Variable="DotNetRelaseVariable64"
            Root="HKLM"
            Key="SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full"
            Value="Release"
            Result="value"
            Bitness="always64" />
        <Chain>
            <ExePackage DetectCondition="DotNetRelaseVariable64 &gt;= 533320"
                SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe"
                InstallArguments="/norestart /q" UninstallArguments="/q">
            </ExePackage>
            <!-- TODO: Define the list of chained packages. -->
            <!-- ExePackage DetectCondition="WIX_IS_NETFRAMEWORK_481_OR_LATER_INSTALLED" InstallArguments="/norestart /q" UninstallArguments="/q"
                SourceFile="DirectoryTo\NDP481-x86-x64-AllOS-ENU.exe" -->
                <!-- Payload SourceFile="DirecotryTo\NDP481-x86-x64-AllOS-ENU.exe"/ -->
            <!-- /ExePackage -->
            <!-- <MsiPackage SourceFile="path\to\your.msi" /> -->
            <MsiPackage SourceFile="DirectoryTo\TestSetup.msi"/>
        </Chain>
    </Bundle>

</Wix>
3npbholx

3npbholx5#

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace TestCShorpInstaller
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Process installerProcess = new Process();
            System.Diagnostics.ProcessStartInfo processInfo = new ProcessStartInfo();

            RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full");
            if (key != null)
            {
                Object o = key.GetValue("Release");
                Int32 releaseVal = (Int32)o;
                if( releaseVal < 533320) {
                    processInfo.FileName = ".\\NDP481-x86-x64-AllOS-ENU.exe";
                    installerProcess.StartInfo = processInfo;   
                    installerProcess.Start();
                    installerProcess.WaitForExit();
                }

            }

            installerProcess = new Process();
            processInfo = new ProcessStartInfo();
            processInfo.Arguments = @"/i TestSetup.msi";
            processInfo.FileName = "msiexec";
            installerProcess.StartInfo = processInfo;
            installerProcess.Start();
            installerProcess.WaitForExit();
        }
    }
}

相关问题