3

我正在使用 InnoSetup 安装我构建的应用程序。我的客户要求它在使用此 InnoSetup 插件安装时下载最新的 DLL:

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

很简单。我让它按我想要的方式工作,但是没有[Files]部分(因为它下载它们而不是将它们构建到脚本中),我不确定如何将下载的 DLL 注册到 GAC。在[Files]部分中,我使用了标志gacinstall

现在我不再使用[Files],我想知道是否有办法通过 Pascal 脚本将 DLL 安装到 GAC?

这是我的设置脚本的相关部分:

[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  

谢谢你的帮助。

4

2 回答 2

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 Scripting 中,您可以使用 GAC API。

它没有正式记录,这里有一些文章很好地涵盖了它。

  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

这是导入 InnoSetup 内部使用的融合 DLL的Delphi 代码CVS 日志)。

于 2011-06-05T13:29:47.997 回答
0

如果您可以调用 .NET 代码,则可以使用以下方法向 GAC 注册程序集:

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

这在System.EnterpriseServices程序集中可用。

于 2011-06-06T03:19:58.903 回答