需要时自动从 Web 安装 .net Framework 4.0,并安装复杂的文件列表
Posted
技术标签:
【中文标题】需要时自动从 Web 安装 .net Framework 4.0,并安装复杂的文件列表【英文标题】:Install the .net Framework 4.0 from web automatically when needed with a complex list of file in instalation 【发布时间】:2013-09-06 13:55:30 【问题描述】:我已经完成了一个安装项目,其中包含多个文件、DLL、一个 Windows 窗体应用程序和一个 Windows 服务。一切都是用 C# (.net) 编写的。
我使用 WiX 配置 msi 安装,现在文件是这样的:
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Product Id="*" Name="App Name" Language="1033" Version="1.0.0"
Manufacturer="Company Name" UpgradeCode="GUID-HERE">
<Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
<Icon Id="InstallIcon" SourceFile="msiicon.ico" />
<Property Id="ARPPRODUCTICON" Value="InstallIcon" />
<Media Id="1" Cabinet="SingleCab.cab" EmbedCab="yes" />
<Feature Id="ProductFeature" Title="Title" Level="1">
<!-- Some features here-->
</Feature>
<UI><!-- Many UI here--></UI>
</Product>
<!-- Some fragments tag here -->
</Wix>
但我需要插入 .net Framework 4.0 的检查。如果未安装 .net Framework 4.0,则自动运行 Web 安装。
所以我搜索并找到了许多类似的示例。我发现的几乎所有示例都涉及标签 Bundle、Chain 和 MsiPackage。
我的问题是如何将我所拥有的与我找到的示例相结合。
请参阅,在所有示例中(从here 获取下一行)合并项目发生在这一行:
<MsiPackage
SourceFile="$(var.SetupProject1.TargetPath)">
</MsiPackage>
但我没有 Visual Studio 项目,我在 Product 标签中有很多文件。产品标签在<Bundle>
或<MsiPackage>
内不起作用,所以我知道什么?如何将我所有的<Product>
内容放入其中。
【问题讨论】:
如果您想同时安装 .NET 和 .MSI 包 - 作为从最终用户看到的一项操作,您可以使用 Burn 创建一个“包”:wixtoolset.org/documentation/manual/v3/howtos/… 但问题是,在此示例中或您的文档链接中始终使用对 Visual Studio 项目的引用,例如$(var.SetupProject1.TargetPath)
。我将 WiX 与已编译的文件一起使用,而不是项目。
【参考方案1】:
首先,让我们建立一些基线知识...
WiX 项目是 Visual Studio 项目。 Visual Studio 项目是MSBuild 项目。 MSBuild 项目是 XML 文件。通常,MSBuild 项目将其他 MSBuild 项目作为库导入(带有 .targets 扩展名),因为构建项目所需的大部分信息对于所有相同类型的项目(例如 .csproj)都是通用的。可以使用 .NET Framework 附带的 msbuild.exe 构建 MSBuild 项目。 MSBuild 项目最终会执行任务来构建项目。这些任务通常是对命令行工具的调用,或者如果可用的话,是对库的等效函数调用。
要使用 WiX 源文件,需要调用 WiX 的 candle.exe 和 light.exe。生成一些WiX源文件,可以调用WiX的heat.exe。
WiX 提供 MSBuild 任务来为您完成此任务。它还提供了导入这些任务的 MSBuild 项目模板。您通常会使用诸如Visual Studio (non-express) 或SharpDevelop (free) 之类的IDE 将项目模板转换为项目。但是您可以手动编写一个项目文件,参考example。同样,可以通过调用 msbuild.exe 来构建此类项目,或者 IDE 可以为您调用 MSBuild。
使用 IDE 编辑 WiX 源文件和项目都很方便。可以使用 IDE 的项目设计器或 XML 编辑器来编辑项目文件。 (在 VS 的解决方案资源管理器中,执行项目卸载然后项目编辑。)由于源文件和项目都是 XML,IDE 应该根据文件的 XML 模式提供帮助。
许多类型的项目(例如 .csproj 和 .wixproj)允许项目引用其他项目。项目引用的目的和功能取决于项目的 MSBuild 导入。您可能熟悉 C# 项目中的 C# 项目参考。至少,人们会期望在引用项目之前构建引用的项目。
WiX 项目可以引用 .NET 项目(例如 .csproj)或其他 WiX 项目。对于每个项目引用,WiX 根据所引用项目的名称定义了一些useful variables。例如:如果您有一个 WiX Bootstrapper 项目,它可以引用名为 SetupProject1
的 WiX 设置项目,因此将定义 var.SetupProject1.TargetPath
以在引导程序源代码中使用。另一个示例:如果您有一个 WiX 安装项目,它可以引用一个名为 ConsoleApplication1
的 C# 项目,因此将定义 var.ConsoleApplication1.TargetPath
。在这两个示例中,目标路径很可能因项目配置(例如调试、发布)而异。 WiX 将变量指向基于配置的引用项目中定义的适当路径。
底线
-
Product 元素用于 WiX 设置项目; Bundle 元素用于 WiX Bootstrapper 项目。 (如果不使用项目文件,您需要为产品调用一次 WiX 的命令行工具,为捆绑包调用一次)。
对于包元素,SourceFile 应该是相应 msi 或 exe 文件的路径。它可以是路径,也可以是在candle.exe 命令行上或通过项目引用定义的变量。
您可能错过了使用 WiX 项目和 MSBuild 的便利。与所有 Visual Studio 项目一样,您可以不使用 IDE,也可以选择免费或付费的 IDE。大概,您已经在为您的 C# 项目使用 IDE 和 MSBuild。将它们用于 WiX 项目与将 VB.NET 项目添加到您的解决方案没有太大区别。
您应该考虑一个引用您的 C# 项目的 WiX 设置项目和一个引用您的 WiX 设置项目的 WiX Bootstrapper 项目。构建解决方案,你就完成了!
(当然,在开发过程中,您可能不希望在解决方案中设置项目。在这种情况下,请使用多个解决方案文件。)
【讨论】:
以上是关于需要时自动从 Web 安装 .net Framework 4.0,并安装复杂的文件列表的主要内容,如果未能解决你的问题,请参考以下文章
通过TeamCity实现ASP.NET Core Web Application的自动编译及发布
第 5 章 自动化测试模型 - Selenium3 自动化测试
我可以使用 .NET Framework 从指定的 IP 地址发送 Web 请求吗?