2014-05-22 8 views

Odpowiedz

6

To nie jest idealne rozwiązanie, ale spędziłem dwa dni, aby go uruchomić i chciałem się nim podzielić. Bez wątpienia będą pewne błędy, ale zrobiłem tak dobrze, jak tylko mogę w dostępnym czasie:

  1. Dodaj nowy projekt i wybrania instalację systemu Windows Installer Xml Projektu
  2. Dodaj nowy projekt, a następnie wybierz Instalator Windows C# Xml Niestandardowe działania projektowe
  3. w projekcie instalacji:

    • dodać coś do zainstalowania np pliki \ strona internetowa itp. (Zobacz inne samouczki, jak to zrobić)
    • Ustaw niektóre właściwości w pliku Product.wxs, np.

      <Property Id="MyProperty1" /> 
      <Property Id="MyProperty2" /> 
      
    • referencyjne Nowo utworzone niestandardowe działania (poniżej) w swoim Product.wxs:

      <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> 
      
  4. Dodaj poniższy kod do działań w ramach projektu lub coś podobnego niestandardowe:

Dodaj klasę CustomAction:

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; 
    } 
    } 

Tworzenie pliku C: \ \ temp Parameters.xml przechowywać na dysku

<?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> 

nb nie trzeba odwoływać się do projektu działań niestandardowych z projektu instalacji. Nie powinieneś także ustawiać właściwości zbyt późno w cyklu instalacji, które są wymagane na początku, na przykład te, które są Ścieżkami plików do instalowania plików. Staram się ich unikać.

Użyj swoich właściwości w pliku Product.wxs, aby coś zrobić! na przykład Używam odzyskanego mienia zaktualizować punkt końcowy serwis internetowy w zainstalowanym web.config

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

Jak zawsze z instalatorów Wix, nic nie działa za pierwszym razem.Odbudować swoją SetupProject Wix i uruchomić msi lokalnie z następującym wierszu polecenia, aby włączyć zalogowaniu na:

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

Po uruchomieniu otworzyć plik dziennika i powinieneś zobaczyć następujące zdarzenia:

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. 

Referencje dla tego postu:

Creating WiX Custom Actions in C# and Passing Parameters

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

Create an MSI log file

+0

Witam sarin. Niezwykle ciekawy pomysł! Prawdopodobnie użyję tego do mojej sprawy. Pytanie tylko, w jaki sposób uzyskać plik .xml z parametrami z folderu lokalnego, w którym znajduje się plik MSI, a nie na twardym kodowaniu ścieżki do C: \ temp \ Parameters.xml? Czy jest jakiś sposób w kodzie C# działania niestandardowego, aby uzyskać lokalizację pliku MSI, który go nazwał? – Ivan

+0

Jeśli chcesz uzyskać ścieżkę pliku w stosunku do miejsca, z którego uruchamiany jest msi, zobacz [ten artykuł] (http://stackoverflow.com/questions/1642827/finding-my-main-executables-path-using -montaż-vs-appdomain) – sarin

+0

Witam sarin. Dziękuję za odpowiedź. Niestety nie jestem programistą C#, więc trudno byłoby mi uzyskać ścieżkę do MSI. Prawdopodobnie podam ścieżkę do pliku .xml w oddzielnej usłudze, jak opisano [tutaj] (http://plainoldstan.blogspot.co.uk/2010/11/wix-set-properties-from-managed-custom.html) – Ivan