WIX安装.NET和VSTO如果是管理员,如果是非管理员,则提前失败
我正在尝试将Excel插件部署到大众市场。该插件需要VSTO运行时(vstor_redist.exe)和.NET 4.5(对于64位操作系统)或.NET 4.0(对于32位操作系统)。我愿意假设潜在用户至少已经拥有.NET2.0。目前我的设置包括:WIX安装.NET和VSTO如果是管理员,如果是非管理员,则提前失败,wix,vsto,burn,Wix,Vsto,Burn,我正在尝试将Excel插件部署到大众市场。该插件需要VSTO运行时(vstor_redist.exe)和.NET 4.5(对于64位操作系统)或.NET 4.0(对于32位操作系统)。我愿意假设潜在用户至少已经拥有.NET2.0。目前我的设置包括: 单独的32位和64位WIX.msi安装程序,以每个用户模式安装插件 单独的32位和64位引导程序捆绑包,包装每个.msi并安装VSTO运行时和.NET,如下面的代码所示: <util:RegistrySearch Id="VSTORuntime
<util:RegistrySearch Id="VSTORuntimeTest" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="VSTORFeature_CLR40" Variable="VSTORFeature"/>
<util:RegistrySearch Id="VSTORuntimeVersionV4R" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4R\" Value="Version" Variable="VSTORVersionV4R"/>
<util:RegistrySearch Id="VSTORuntimeVersionV4" Root="HKLM" Key="SOFTWARE\Microsoft\VSTO Runtime Setup\v4\" Value="Version" Variable="VSTORVersionV4"/>
<Chain>
<!-- Install .Net 4.0 or 4.5, depending on build -->
<?ifdef x64?>
<PackageGroupRef Id="NetFx45Web" />
<?endif ?>
<?ifdef x86?>
<PackageGroupRef Id="NetFx40Web" />
<?endif ?>
<RollbackBoundary />
<!-- Install VSTO runtime -->
<ExePackage Id="VSTORuntime" SourceFile="..\resources\vstor_redist.exe" Permanent="yes" Vital="yes" Cache="no" Compressed="no"
DownloadUrl="http://go.microsoft.com/fwlink/?LinkId=158917"
PerMachine="yes"
InstallCommand="/q /norestart"
DetectCondition="VSTORFeature"
InstallCondition="NOT VSTORFeature OR NOT (VSTORVersionV4R >=v10.0.40303) OR NOT (VSTORVersionV4 >=v10.0.21022)" />
<RollbackBoundary />
<?ifdef x64?>
<MsiPackage
Id="nx_msi_package_version"
SourceFile="..\My 64 bit Setup.msi"
Compressed="yes"
Vital="yes" />
<?endif ?>
<?ifdef x86?>
<MsiPackage
Id="nx_msi_package_version"
SourceFile="..\My 32 bit Setup.msi"
Compressed="yes"
Vital="yes" />
<?endif ?>
</Chain>
谢谢,Eric对我来说最好的方法就是用我的32位C#包装器来完成这项工作。正如我问题中的代码所指出的,Burn似乎没有提供任何内置的VSTO支持包——相反,我只是手动读取注册表,并以此为基础建立逻辑。Burn确实为.NET4.0和.NET4.5提供了预构建的包,但我没有看到一种简单的方法来支持这些包的早期失败 我的C#2.0包装现在包括以下逻辑:
private static bool NeedsMorePermissionToInstallPrerequisites(out string error)
{
error = string.Empty;
// Is user an admin? If so, we're OK
if (PrivilegeTester.CanBeAdmin())
{
return false;
}
// Is .NET already installed?
bool isDotNetInstalled;
string dotNetVersion;
if (Is64BitOperatingSystem())
{
isDotNetInstalled = PrereqSoftwareChecker.IsDotNet45Installed();
dotNetVersion = "Microsoft .NET 4.5";
}
else
{
isDotNetInstalled = PrereqSoftwareChecker.IsDotNet40Installed();
dotNetVersion = "Microsoft .NET 4.0";
}
// Is VTSO already installed?
bool isVtsoInstalled = PrereqSoftwareChecker.IsVstoRuntimeInstalled();
if (isVtsoInstalled && isDotNetInstalled)
{
return false;
}
// If we got this far, there's trouble. Build the error.
[...]
这里的CanBeAdmin()功能是基于,而IsVstoRuntimeInstalled()查看的注册表项集与我在原始问题中的VSTORuntimeTest等逻辑中使用的注册表项集完全相同。NET检查还使用MSDN中详细记录的键查看注册表。例如:
internal static bool IsDotNet40Installed()
{
try
{
Version dotnet4Version = new Version(GetHKLMValue("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4.0\\Client", "Version").ToString());
return dotnet4Version >= new Version("4.0.0.0");
}
catch
{
return false;
}
}
private static object GetHKLMValue(string key, string valueName)
{
return Registry.GetValue("HKEY_LOCAL_MACHINE\\" + key, valueName, null);
}
如果Burn能够更好地处理这样的事情,那就太好了,但这可能会很复杂,因为仅仅提供一个Fail Early.NET包和一个单独的Fail Early VSTO包不足以构建一个完整的包列表,而这些包需要由管理员独立安装
在bootstrapper包装器代码中使用C#和.NET 2.0显然是一种风险,但我猜,在野外没有太多旧的XP机器有Office,至少没有.NET 2.0