2014-02-04 4 views
1

Я пытаюсь развернуть подключаемый модуль Excel на массовый рынок. Плагин требует VSTO runtime (vstor_redist.exe) и .NET 4.5 (для 64-разрядной ОС) или .NET 4.0 (для 32-разрядной ОС). Я готов предположить, что у потенциальных пользователей уже есть как минимум .NET 2.0. В настоящее время моя установка состоит из:WIX Установите .NET и VSTO, если администратор, не работает раньше, если не администратор

  1. Отдельные 32-разрядные и 64-разрядные установщики WIX .msi, которые устанавливают плагин в режиме для каждого пользователя.
  2. Отдельные 32 бит и 64 бит пучки Bootstrapper, которые обертка каждый .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> 
    
  3. приложения .NET 2.0 обертку, которая включает в себя как bootstrappers как встроенные ресурсы и развертывания & запускает правильный загрузочный файл для клиентской ОС. (По существу, ответ Йохай Timmer в Single MSI to install correct 32 or 64 bit c# application)

Все это чувствует, как turducken, но он прекрасно работает как для тихих обновлений и свежей устанавливает, когда пользователь имеет администратора учетные данные. Но если пользователь не является администратором и еще не имеет как VSTO, так и соответствующий .NET, он с ошибкой несется с ошибкой: «0x8007051b - этот идентификатор безопасности не может быть назначен как владелец объекта» после долгой загрузки обработать.

Что я хотел бы сделать, так это заранее проверить, должен ли пользователь запрашивать у администратора вмешательство и установку VTSO и/или .NET для них и отображать сообщение, в идеале, с ссылками на сайты, когда это это так. Эта проверка может быть в загрузчике или в моей оболочке .NET 2.0. Любая рекомендация о том, как лучше всего это сделать?

Спасибо, Эрик

ответ

0

Самый лучший способ для меня, чтобы сделать работу в моем 32-битном C# обертке. Как указывает код в моем вопросе, Burn не предлагает какой-либо встроенный пакет с поддержкой VSTO - вместо этого я просто читаю реестр вручную и основываю свою логику на этом. Burn предлагает готовые пакеты для .NET 4.0 и .NET 4.5, но я не видел простой способ поддержки Fail Early с ними.

Мой 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() основана на Calling IPrincipal.IsInRole on Windows 7 и 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); 
    } 

Было бы неплохо, если бы Ожог может обрабатывать что-то вроде этого лучше, но это может быть сложным, так как просто предоставление пакета Сбой Early .NET и отдельный пакет Сбой Раннее VSTO не будет достаточно создайте полный список пакетов, которые необходимо будет установить независимо администратором.

Использование C# и .NET 2.0 в коде обертки-загрузчика, очевидно, является риском здесь, но я предполагаю, что в дикой природе не так много старых колонок XP, у которых есть Office, и у них нет, по крайней мере, .NET 2.0.

Смежные вопросы