2013-03-25 12 views
5

Mam usługę WCF, którą hostuję jako usługę Windows. Zwykle przechodzę do wiersza poleceń VS i instaluję usługę za pomocą installutil.exe, a następnie modyfikuję adres bazowy usługi w app.config zgodnie z nazwą komputera, na którym ją instaluję i uruchamiam usługę.Ustawienia Inno Modyfikowanie pliku app.config po uruchomieniu pliku setup.exe

adres bazowy idzie tak:

<endpoint address="http://MACHINE_NAME/NFCReader/" binding="webHttpBinding"/> 

zmodyfikować NAZWA_KOMPUTERA w pliku app.config.

Chcę użyć inno setup, aby zrobić to samo dla mnie.

To, czego chcę, to gdy użytkownik uruchamia plik setup.exe, aby zainstalować usługę, chcę poprosić użytkownika o adres bazowy usługi i użyć tego adresu do hostowania. Nie jestem w stanie dowiedzieć się, czy jest to w ogóle możliwe LUB jak to zrobić.

Proszę o pomoc? Z góry dziękuję. :)

Odpowiedz

5

Tylko przykład używam do zamiany napisu w mojej konfiguracji aplikacji.
Jestem pewien, że można to zrobić lepiej :-)

Co mogę wymienić to:

dodać klucz = wartość "AppVersion" = "YYMMDD.HH.MM"

[Code] 
procedure Update; 
var 
C: AnsiString; 
CU: String; 
begin 
     LoadStringFromFile(ExpandConstant('{src}\CdpDownloader.exe_base.config'), C); 
     CU := C; 
     StringChange(CU, 'YYMMDD.HH.MM', GetDateTimeString('yymmdd/hh:nn', '.', '.')); 
     C := CU; 
     SaveStringToFile(ExpandConstant('{src}\Config\CdpDownloader.exe.config'), C, False);   
end; 

function InitializeSetup: Boolean; 
begin 
    Update; 
result := True; 
end; 
+1

Tak, na przykład za pomocą analizatora składni XML. Jeśli znasz już MSXML, możesz wykonać ['this post'] (http://stackoverflow.com/a/11254218/960757). To całkiem proste, aby rozszerzyć go do swoich potrzeb. Szybki parser XML dla InnoSetup znajduje się na mojej liście zadań (ale zajmie to trochę czasu). – TLama

+1

Parser/program piszący XML jest niepotrzebną komplikacją, jeśli masz znany, unikatowy ciąg znaczników w pliku szablonu, który możesz zastąpić (podobny do powyższego kodu). Dobrym pomysłem jest jednak, aby móc modyfikować pliki, do których nie można wprowadzić takich znaczników (np. Jeśli trzeba zaktualizować plik już zainstalowany w systemie użytkownika). Należy jednak zauważyć, że powyższy kod zawiera błąd: "DateTime" jest traktowany jako wartość ISPP zamiast funkcji kodu. Powinien być wywołany bezpośrednio, a nie przez 'ExpandConstant'. – Miral

+0

Poprawione. Dzięki za wskazówkę. – RobeN

2

I zaleciłby użycie parsera XML do aktualizacji plików konfiguracyjnych. Poniższa funkcja może Ci w tym pomóc. Używa MSXML jako parsera plików:

[Code] 
const 
    ConfigEndpointPath = '//configuration/system.serviceModel/client/endpoint'; 

function ChangeEndpointAddress(const FileName, Address: string): Boolean; 
var 
    XMLNode: Variant; 
    XMLDocument: Variant; 
begin 
    Result := False; 
    XMLDocument := CreateOleObject('Msxml2.DOMDocument.6.0'); 
    try 
    XMLDocument.async := False; 
    XMLDocument.preserveWhiteSpace := True; 
    XMLDocument.load(FileName);  
    if (XMLDocument.parseError.errorCode <> 0) then 
     RaiseException(XMLDocument.parseError.reason) 
    else 
    begin 
     XMLDocument.setProperty('SelectionLanguage', 'XPath'); 
     XMLNode := XMLDocument.selectSingleNode(ConfigEndpointPath); 
     XMLNode.setAttribute('address', Address); 
     XMLDocument.save(FileName); 
     Result := True; 
    end; 
    except 
    MsgBox('An error occured during processing application ' + 
     'config file!' + #13#10 + GetExceptionMessage, mbError, MB_OK); 
    end; 
end; 
+2

Mogę pomóc ci z resztą Twoich wymagań (utwórz stronę wejściową przed rozpoczęciem instalacji, aby umożliwić użytkownikowi wpisanie adresu punktu końcowego i wywołanie powyższej funkcji po pomyślnym zakończeniu instalacji), jeśli musisz. Po prostu daj mi znać ... – TLama

+0

Wow .. spróbuję tego ... dziękuję bardzo ...: D – Newbee

+0

Jak leci? Wszelkie opinie będą doceniane ;-) – TLama

Powiązane problemy