Могу ли я зарегистрироваться в GAC с помощью Pascal scripting (InnoSetup)?


Я использую InnoSetup для установки приложения, которое я построил. Мой клиент просит, чтобы он загрузил последние библиотеки DLL при установке с помощью этого дополнения InnoSetup:

Http://www.sherlocksoftware.org/page.php?id=50

Достаточно просто. Я получил его работу, как я хочу, но без раздела [Files] (потому что он загружает их, а не строит их в сценарий), я не уверен, как зарегистрировать загруженные DLL в GAC. С разделом [файлы] в, я использовал флаг 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 3

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] позаботится об этом за вас.

Из сценариев Pascal можно использовать API GAC.

Это официально не задокументировано, вот некоторые статьи, которые делают хорошую работу по освещению оно.

  1. http://support.microsoft.com/default.aspx?scid=kb; en-us;317540
  2. http://www.codeproject.com/KB/system/gacapi.aspx
  3. http://www.codeproject.com/KB/dotnet/undocumentedfusion.aspx

Вы можете построить что-то самостоятельно, чтобы вызвать API, или вы можете распространить это приложение и использовать его, вызывая Exec, или ShellExec.

Вот код Delphi (CVS log ) к импорт библиотеки DLL fusion, которую InnoSetup использует внутренне.

Если вы можете вызвать .NET-код, вы можете зарегистрировать сборки в GAC, используя:

System.EnterpriseServices.Internal.Publish.GacInstall(string path)

, которая доступна в сборке System.EnterpriseServices.