我正在使用InnoSetup安装我构建的应用程序。我的客户端请求在安装时使用InnoSetup插件下载最新的DLL:
http://www.sherlocksoftware.org/page.php?id=50
很简单。我让它按我想要的方式工作,但如果没有[Files]部分(因为它是下载它们而不是将它们构建到脚本中),我不知道如何将下载的DLL注册到GAC。在中的[Files]部分中,我使用了标志gainstall。
现在我不再使用[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
谢谢你的帮助。
在[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脚本,您可以使用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
来使用它。
以下是导入InnoSetup内部使用的融合DLL的Delphi代码(CVS日志)。
如果可以调用.NET代码,则可以使用将程序集注册到GAC
System.EnterpriseServices.Internal.Publish.GacInstall(string path)
其在CCD_ 9组件中可用。