如何安装.NET Framework 4.0作为安装的一部分?

时间:2011-08-09 05:34:23

标签: .net frameworks installer wix

我创建了bootstrapper,它可以工作 但它不安装.NET Framework 4.0。安装完成后,我的应用程序无法启动,因为没有.NET Framework 4.0。 为什么不安装NETF 4.0?

<ItemGroup>
    <BootstrapperFile Include="Microsoft.Windows.Installer.4.5">
      <ProductName>Windows Installer 4.5</ProductName>
    </BootstrapperFile>
       <BootstrapperPackage Include=".NETFramework,Version=v4.0">
            <Visible>True</Visible>
            <ProductName>.NET Framework 4.0</ProductName>
            <Install>True</Install>
        <Visible>True</Visible>
      </BootstrapperPackage>
  </ItemGroup>
  <Import Project="$(WixTargetsPath)" />
  <Target Name="AfterBuild">
    <GenerateBootstrapper ApplicationFile="DOGInstaller.msi" 
    ApplicationName="DOG" 
    BootstrapperItems="@(BootstrapperFile)" 
    CopyComponents="True" 
    ComponentsLocation="HomeSite"
    OutputPath="$(OutputPath)\en-us\"
    Path="C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bootstrapper" 
    Culture="en" />
  </Target>

3 个答案:

答案 0 :(得分:5)

在wixproj文件中,添加以下结构。请注意,<WixTargetsPath>标记必须位于第一个<PropertyGroup>节点中,以及通常存在的其余节点。

<Project>
  <PropertyGroup> <!-- This must be the first PropertyGroup node. -->
    ...
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
    <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
  </PropertyGroup>
  ...
  <ItemGroup>
    <BootstrapperFile Include="Microsoft.Windows.Installer.3.1">
      <ProductName>Windows Installer 3.1</ProductName>
    </BootstrapperFile>
    <BootstrapperFile Include=".NETFramework,Version=v4.0">
      <ProductName>Microsoft .NET Framework 4.0 (x86 and x64)</ProductName>
    </BootstrapperFile>
  </ItemGroup>
  <PropertyGroup>
    <BootstrapperPath>$(ProgramFiles)\Microsoft SDKs\Windows\v7.0A\Bootstrapper\</BootstrapperPath>
  </PropertyGroup>
  <Target Name="AfterBuild">
    <GenerateBootstrapper
      ApplicationFile="$(TargetFileName)"
      ApplicationName="$(OutputName)"
      BootstrapperItems="@(BootstrapperFile)"
      ComponentsLocation="Relative"
      CopyComponents="True"
      OutputPath="$(OutputPath)"
      Path="$(BootstrapperPath)" />
  </Target>
</Product>

答案 1 :(得分:3)

项目组中的所有项目都需要具有相同的名称“BootstrapperFile” - 目前您将有两个项目组,因此.Net Framework将不会包含在引导程序中(因为它位于名为“不同的项目组”中) BootstrapperPackage”。

虽然网上的大多数示例都使用“BootstrapperFile”或“BootstrapperPackage”,但名称并不重要,只需要与引导程序生成任务的参数对齐 - 遗憾的是,在某些情况下,示例的一致性会导致误解:)

更正后,要检查的另一件事是,在本地计算机和构建服务器(如果有的话)上构建时没有记录任何警告 - 默认情况下,boostrapper生成任务不会导致构建如果无法找到一个或多个包,则会失败。

您将在msbuild日志中看到:

  • 警告MSB3155:项目'.NETFramework,Version = v4.0'无法找到''。

使用引导程序的简单方法是检测到这种情况:

  1. 您生成的.exe文件异常小 - 比如300-400K。
  2. 删除伴随的.MSI文件,然后运行引导程序 - 它将生成一个日志文件(它提供错误消息中的路径)。日志文件将列出已检查的软件包(以查看是否需要执行这些软件包)以及执行的内容。如果您的包不在列表中,则可能不在引导程序中。

答案 2 :(得分:0)

我使用dotnetinstaller来检查和安装先决条件。它非常简单易用。它还提供了将msi转换为exe并附加UAC提示的功能。 您需要configuration file

然后在构建后事件的项目中添加此代码。这将嵌入您的msi和先决条件文件。

copy /Y "$(ProjectDir)Files\dotnetfx35setup.exe" "C:\Windows\Temp"
copy /Y $(TargetPath) "C:\Windows\Temp"
"$(SolutionDir)Tools\dotNetInstaller 2.0\Bin\installerLinker.exe" /o:"$(TargetDir)Setup.exe" /t:"$(SolutionDir)Tools\dotNetInstaller 2.0\Bin\dotNetInstaller.exe" /c:"$(ProjectDir)Files\Configuration.xml" /b:"$(ProjectDir)Files\banner.bmp" /Embed+ /Verbose+