Po stronie InnoSetup spróbuj w takim razie PWideChar.
Wyjaśnienie.
string w InnoSetup, Delphi, C++, czy czymś jeszcze innym to zupełnie inny typ danych. Stringi w językach programowania nie są ze sobą tożsame. W różnych językach zawierają różne informacje w różnych miejscach. Tzn. string to tak naprawdę taki typ pomocniczy na czysty łańcuch znaków.
Podstawowym typem, który trzyma dane tekstowe jest tablica znaków. Czyli ciągły obszar w pamięci zakończony znakiem NUL, np:
(to jest fragment pamięci - jeden znak to jeden bajt, dla uproszczenia)
gdzie [\0] to jeden znak - NUL (ASCII = 0)
To jest tablica znaków, która reprezentuje jakiś ciąg tekstowy. Tablica ma swój początek w pamięci i to jest tzw. adres tablicy. Nikt nie zna jej długości. Po prostu odczytywane jest wszystko aż do napotkania znaku NUL.
Następnie mamy coś takiego jak string. W każdym języku wygląda on inaczej. Np. w Delphi w pamięci MOŻE wyglądać tak:
(fragment pamięci, każdy znak to jeden bajt, określający liczbę. Dla ułatwienia napisałem po ludzku w hexie)
I co to jest? Jak to się ma do Ali, która ma kota? Ano string jest typem referencyjnym. Tzn., że odnosi się gdzieś do sterty. Wskazuje. Jest tak jakby wskaźnikiem na jakiś obszar na stercie.
Tutaj konkretnie wskazujemy na adres 0x5AFCD.
A co mamy pod tym adresem? Może być np. coś takiego:
(fragment w pamięci <-- tutaj pierwsze 8 znaków to tak naprawdę zapis binarny liczb, dla ułatwienia napisałem je po ludzku w hexie)
Kopiuj
0001000BALA MA KOTA[\0]
Ten string ma w sobie więcej informacji, pierwsze 4 bajty to może być reference count, kolejne 4 bajty to mogą być długością stringa, a następnie dopiero masz faktyczny ciąg znaków.
I teraz, gdy kompilator zobaczy, że ma do czyniena z typem string, dokładnie wie, co ma zrobić.
Ty przekazując jakieś dane pomiędzy bibliotekami, tak naprawdę przekazujesz ciąg bajtów.
A więc przekazując stringa, przekazujesz tak naprawdę "wskaźnik", który wskazuje gdzieś na stertę. Musisz zatem przekazać coś, o czym obie strony doskonale są poinformowane. Tym czymś jest np. stara, dobra tablica znaków zakończona znakiem NUL.
A więc ze strony C# musisz przekazać taką tablicę (C# to robi jakoś automagicznie, więc może wystarczy jeśli faktycznie przekażesz tam string. Jeśli INNOSetup ma to tylko ODCZYTAĆ i nic z tym więcej nie zrobić). Po stronie InnoSetup jednak musisz już użyć tablicy znaków. Normalnie w Delphi to jest PChar (to jest unikodowa tablica znaków), a w InnoSetup gdzieś znalazłem info, że nie ma PChar, ale jest PAnsiChar i PWideChar. Różnią się tylko tym, że PAnsiChar to jest tablica znaków ANSI (czyli każdy znak zajmuje jeden bajt), a PWideChar to jest unikodowa tablica znaków.