2014-05-22 19 views
6

nasıl yükleme sırasında kullanılmak üzere bir XML dosyası parametre değerleri ithal bir Wix yükleyici yazıyorsunuz bir XML dosyasından Parametreleri Okuma?Wix Özel Eylemler -

cevap

6

Bu mükemmel bir çözüm değildir ama işe alma iki gün geçirdim ve paylaşmak istedim. Hiç şüphesiz bazı hatalar olacaktır, ama mevcut sürede elimden kadar iyi yapmış:

  • Yeni Bir Proje ekleyin ve bir seçiniz Project

    1. Yeni bir proje ekleyin ve bir Windows Installer XML Setup seçmek kurulum projesinde Windows Installer XML C# Özel Eylemler Proje
    2. :

      • bir şeyler ekleyin örneğin kurulacak dosyalar \ vb web sitesi
      • sizin Product.wxs örneğin bazı özellikleri ayarlayın (bunun nasıl yapılacağı üzerinde diğer öğreticiler bakınız) senin Product.wxs içinde

        <Property Id="MyProperty1" /> 
        <Property Id="MyProperty2" /> 
        
      • Referans yeni oluşturulan Özel Eylemler (aşağıda):

      • :

        <Product> ..... 
            <Binary Id='VantageInstallerCustomActions.CA.dll' src='..\VantageInstallerCustomActions\bin\$(var.Configuration)\VantageInstallerCustomActions.CA.dll' /> 
            <InstallExecuteSequence> 
             <Custom Action="SetInstallerProperties" Before="CostFinalize" /> 
            </InstallExecuteSequence> 
        </Product> 
        
        <Fragment> 
            <CustomAction Id='SetInstallerProperties' BinaryKey='VantageInstallerCustomActions.CA.dll' DllEntry='SetInstallerProperties' Return='check' Execute='immediate' /> 
        </Fragment> 
        
    3. , Özel Eylemler proje veya benzer bir şey aşağıdaki kodu ekleyin

      0:

    bir CustomAction Ders ekle

    public class CustomActions 
        { 
        private static readonly InstallerPropertiesFileManager InstallerPropertiesFileManager = new InstallerPropertiesFileManager(); 
    
        [CustomAction] 
        public static ActionResult SetInstallerProperties(Session session) 
        { 
         session.Log("Begin SetInstallerProperties"); 
    
         try 
         { 
    
          var doc = XDocument.Load(@"C:\temp\Parameters.xml"); 
    
          session.Log("Parameters Loaded:" + (doc.Root != null)); 
          session.Log("Parameter Count:" + doc.Descendants("Parameter").Count()); 
          var parameters = doc.Descendants("Parameter").ToDictionary(n => n.Attribute("Name").Value, v => v.Attribute("Value").Value); 
    
          if (parameters.Any()) 
          { 
           session.Log("Parameters loaded into Dictionary Count: " + parameters.Count()); 
    
           //Set the Wix Properties in the Session object from the XML file 
           foreach (var parameter in parameters) 
           { 
            session[parameter.Key] = parameter.Value; 
           } 
          }     
          else 
          { 
           session.Log("No Parameters loaded"); 
          } 
         } 
         catch (Exception ex) 
         { 
          session.Log("ERROR in custom action SetInstallerProperties {0}", ex.ToString()); 
          return ActionResult.Failure; 
         } 
         session.Log("End SetInstallerProperties"); 
         return ActionResult.Success; 
        } 
        } 
    

    sizin oluşturun C: \ temp \ Parameters.xml dosyası diskte saklamak için

    <?xml version="1.0" encoding="utf-8"?> 
        <Parameters> 
         <Environment ComputerName="Mycomputer" Description="Installation Parameters for Mycomputer" /> 
         <Category Name="WebServices"> 
          <Parameter Name="MyProperty1" Value="http://myserver/webservice" /> 
          <Parameter Name="MyProperty2" Value="myconfigSetting" /> 
         </Category> 
        </Parameters> 
    

    N.B. Kurulum Projesinden Özel Eylemler Projesine başvurmanız gerekmez. Ayrıca, kurulum döngüsünde çok erken geçmesi gereken özellikleri, örneğin, dosyaları yüklemek için Dosya Yolları olanlar için, önceden gerekli olmamalıdır. Bunlardan kaçınmaya eğilimliyim.

    Ürününüzü bir şey yapmak için Product.wxs ürününüzde kullanın! Örneğin. Ben yüklü web.config Wix montajcılar Her zaman olduğu gibi

    <Fragment> 
        <DirectoryRef Id ="INSTALLFOLDER"> 
         <Component Id="WebConfig" Guid="36768416-7661-4805-8D8D-E7329F4F3AB7"> 
         <CreateFolder /> 
         <util:XmlFile Id="WebServiceEnpointUrl" Action="setValue" ElementPath="//configuration/system.serviceModel/client/endpoint[\[]@contract='UserService.V1_0.GetUser.ClientProxy.Raw.IGetUserService'[\]]/@address" Value="[MyProperty1]" File="[INSTALLFOLDER]web.config" SelectionLanguage="XPath" /> 
         </Component> 
        </DirectoryRef> 
        </Fragment> 
    

    bir web hizmeti bitiş noktasını güncelleştirmek için alınan özelliğini kullanıyorum, hiçbir şey ilk kez çalışır.

    kez
    msiexec /i "myInstaller.msi" /l*v "log.log" 
    

    çalıştırın günlük dosyasını açmak ve aşağıdaki olayları görmelisiniz: Yeniden İnşa sizin Wix SetupProject ve aşağıdaki komut satırı ile yerel olarak msi çalıştırmak oturum açmak için

    MSI (s) (C4:3C) [11:00:11:655]: Doing action: SetInstallerProperties 
    Action start 11:00:11: SetInstallerProperties. 
    MSI (s) (C4:A8) [11:00:11:702]: Invoking remote custom action. DLL: C:\WINDOWS\Installer\MSICD83.tmp, Entrypoint: SetInstallerProperties 
    MSI (s) (C4:A8) [11:00:11:702]: Generating random cookie. 
    MSI (s) (C4:A8) [11:00:11:702]: Created Custom Action Server with PID 496 (0x1F0). 
    MSI (s) (C4:CC) [11:00:11:733]: Running as a service. 
    MSI (s) (C4:CC) [11:00:11:733]: Hello, I'm your 32bit Impersonated custom action server. 
    SFXCA: Extracting custom action to temporary directory: C:\Users\ak9763\AppData\Local\Temp\MSICD83.tmp-\ 
    SFXCA: Binding to CLR version v4.0.30319 
    Calling custom action VantageInstallerCustomActions!VantageInstallerCustomActions.CustomActions.SetInstallerProperties 
    Begin SetInstallerProperties 
    Parameters loaded into Dictionary: 2 
    MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty1 property. Its value is 'http://myserver/webservice'. 
    MSI (s) (C4!C0) [11:00:11:858]: PROPERTY CHANGE: Adding MyProperty2 property. Its value is 'myConfigSetting'. 
    End SetInstallerProperties 
    Action ended 11:00:11: SetInstallerProperties. Return value 1. 
    
    Bu yazı için

    Referanslar:

    Creating WiX Custom Actions in C# and Passing Parameters

    From MSI to WiX, Part 5 - Custom actions: Introduction

    Create an MSI log file

  • +0

    Merhaba sarin. Son derece ilginç bir fikir! Muhtemelen vakam için kullanacağım. Tek soru - nasıl MSI dosyasının bulunduğu sabit klasörden parametrelerle .xml dosyası C: \ temp \ Parameters.xml yolunu kodlamak yerine nasıl alabilirim? MSI dosyasının yerini almak için Özel Eylemin C# kodunda herhangi bir yolu var mı? – Ivan

    +0

    Dosya yolunu msi'nin çalıştığı yere göre görmek istiyorsanız, [bu makaleye bakın] (http://stackoverflow.com/questions/1642827/finding-my-main-executables-path-using montaj-vs-appdomain) – sarin

    +0

    Merhaba sarin. Cevap için teşekkürler. Ne yazık ki ben bir C# geliştirici değilim, bu yüzden MSI yolunu almak benim için zor olurdu. Muhtemelen .xml dosyasının yolunu aşağıda açıklandığı gibi ayrı bir alanda belirteceğim (http://plainoldstan.blogspot.co.uk/2010/11/wix-set-properties-from-managed-custom.html) – Ivan