Могу ли я зарегистрироваться в GAC с помощью сценариев Pascal (InnoSetup)?
Я использую InnoSetup для установки приложения, которое я построил. Мой клиент запрашивает, чтобы он загружал последние библиотеки DLL после установки, используя это дополнение InnoSetup:
http://www.sherlocksoftware.org/page.php?id=50
Достаточно просто. У меня все работает так, как я хочу, но без раздела [Files] (потому что он загружает их, а не встраивает в сценарий), я не уверен, как зарегистрировать загруженные библиотеки DLL в GAC. С разделом [Files] я использовал флаг gacinstall.
Теперь, когда я больше не использую [Files], мне стало интересно, есть ли способ установить библиотеки DLL в GAC с помощью сценариев Pascal?
Вот соответствующая часть моего скрипта установки:
[Code]
procedure InitializeWizard();
begin
itd_init;
itd_addfile('{#DownloadLocation}/mylibrary1.dll',expandconstant('{tmp}\mylibrary1.dll'));
itd_addfile('{#DownloadLocation}/mylibrary2.dll',expandconstant('{tmp}\mylibrary1.dll'));
itd_downloadafter(wpReady);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin //Lets install those files that were downloaded for us
filecopy(expandconstant('{tmp}\mylibrary1.dll'),expandconstant('{app}\mylibrary1.dll'),false);
filecopy(expandconstant('{tmp}\mylibrary2.dll'),expandconstant('{app}\mylibrary2.dll'),false);
end;
end;
[Run]
Filename: "{app}\{#MyAppExeName}"; Parameters: "-i"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: runhidden
Filename: "{app}\{#MyAppSvcName}"; Parameters: "-i"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: runhidden
Filename: "{app}\{#MyAppExeName}"; Description: "Launch the ItraceIT configuration tool"; Flags: postinstall nowait skipifsilent
[UninstallRun]
Filename: "{app}\{#MyAppSvcName}"; Parameters: "-u"; Flags: runhidden
Filename: "{app}\{#MyAppExeName}"; Parameters: "-u"; Flags: runhidden
Спасибо за вашу помощь.
2 ответа
[Files]
Раздел, вы можете использовать external
флаг, позволяющий загруженным файлам проходить через стандарт [Files]
раздел, где gacinstall
флаг доступен.
[Files]
Source:{tmp}\mylibrary1.dll; DestDir:{app}; StrongAssemblyName: "MyAssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdef123456, ProcessorArchitecture=MSIL" Flags: external; gacinstall;
Тогда вам не нужен ваш звонок CurStepChanged
как [Files]
раздел позаботится об этом за вас.
Из сценариев Паскаля вы можете использовать GAC API.
Это официально не задокументировано, вот несколько статей, которые хорошо справляются с этим.
- http://support.microsoft.com/default.aspx?scid=kb;en-us;317540
- http://www.codeproject.com/KB/system/gacapi.aspx
- http://www.codeproject.com/KB/dotnet/undocumentedfusion.aspx
Вы можете создать что-то самостоятельно для вызова API или распространять это приложение и использовать его, вызывая Exec
, или же ShellExec
,
Вот код Delphi ( журнал CVS) для импорта DLL-библиотеки fusion, которую InnoSetup использует внутри себя.
Если вы можете вызвать код.NET, вы можете зарегистрировать сборки в GAC, используя:
System.EnterpriseServices.Internal.Publish.GacInstall(string path)
который доступен в System.EnterpriseServices
сборка.