Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WIX安装.NET和VSTO如果是管理员,如果是非管理员,则提前失败_Wix_Vsto_Burn - Fatal编程技术网

WIX安装.NET和VSTO如果是管理员,如果是非管理员,则提前失败

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

我正在尝试将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="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>
    
    
    
  • 一个.NET2.0包装器,包括作为嵌入式资源的引导程序,并为客户端操作系统部署和运行正确的引导程序。(基本上是Yochai Timmer在中的回答)

  • 整个过程感觉就像一个turducken,但它可以很好地用于静默升级和在用户具有管理员凭据时进行新的安装。但是,如果用户不是管理员,并且尚未安装VSTO和相应的.NET,则在经过长时间的下载过程后,它将失败,并出现错误:“0x8007051b-此安全ID可能未被指定为对象的所有者”

    我想做的是提前检查用户是否需要要求管理员介入并为他们安装VTSO和/或.NET,并在这种情况下显示消息,最好是带有网站链接。此检查可以在引导程序中,也可以在.NET2.0包装中。有没有关于如何最好地做到这一点的建议


    谢谢,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