Jak napisać instalator Wix, który importuje wartości parametrów z pliku XML do użycia podczas instalacji?Akcje niestandardowe Wix - odczyt parametrów z pliku XML
Odpowiedz
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:
- Dodaj nowy projekt i wybrania instalację systemu Windows Installer Xml Projektu
- Dodaj nowy projekt, a następnie wybierz Instalator Windows C# Xml Niestandardowe działania projektowe
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>
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
Jednym z rozwiązań jest użycie "Community MSI Extensions"
niestandardowego działania jesteś po to chyba Xml_SelectNodeValue (jest to przykład, w jaki sposób z niego korzystać).
- 1. Jak wygenerować WiX XML z pliku .reg?
- 2. Niestandardowe akcje wewnątrz rails_admin gem
- 3. Niestandardowe akcje w Django Admin
- 4. C# PCL odczyt z pliku
- 5. tablice asocjacyjne odczyt z pliku
- 6. angularjs odczyt z pliku właściwości
- 7. C# ciągły odczyt pliku
- 8. C++ Odczyt pliku PDF
- 9. Python argparse niestandardowe akcje z dodatkowymi argumentami przekazanymi
- 10. Niestandardowe akcje CanCan, które nie działają z blokami
- 11. WiX - przekazywanie parametrów do CustomAction (DLL)
- 12. Niestandardowe wyjście XML?
- 13. Odczyt z pliku CSV w programie MATLAB
- 14. FlatBuffers: Zapis i odczyt z pliku binarnego?
- 15. Przenoszenie niestandardowych działań instalacyjnych do Wix
- 16. Zapis/odczyt pliku plist iPhone
- 17. Odczyt pliku w ścieżce sieciowej
- 18. Odczyt pliku do wektora naraz
- 19. odczyt/zapis obiektu do pliku
- 20. Niestandardowe akcje w aplikacji Kontakty (podobne do G +)
- 21. Czytaj xml z pliku
- 22. PHP - Odczyt i naprawa dużych niepoprawnych plików XML
- 23. Odczyt i kodowanie base64 pliku binarnego
- 24. Jak odczytać niestandardowe właściwości pliku w C#
- 25. phonegap odczyt i zapis pliku json
- 26. Jak drogi jest odczyt właściwości pliku? .NET
- 27. Odczyt strumienia stdin w pliku wsadowym
- 28. dekompresja i odczyt pliku gzip w scala
- 29. Java: odczyt i zapis pliku CSV
- 30. Jak zalogować instalację z pakietu WiX
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
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
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