Installshield 自动化接口 - 始终覆盖
Installshield Automation Interface - Always Overwrite
我正在尝试为我工作的公司自动创建安装包,并且正在使用 Installshield Automation Interface 创建 MSI 项目。到目前为止,我们所做的其中一件事(如果您相信的话,是手动完成的)是在将它们导入 installshield 并将它们设置为 "Always overwrite" 之后逐个文件夹地检查我们要发布的所有文件,因为看来你不能在父文件夹上递归地做。在 installshield GUI 上创建基本 MSI 时,它允许您执行此操作,但是当通过 COM 对象创建 MSI 时,该选项似乎仅适用于 InstallScript,我无法使用它创建 MSI。
任何人我的代码有点像这样
static void AddFiles(string[] aFiles, ISWiAuto24.ISWiProject oISProj, string sProjName, string ePackName)
{
oISProj.OpenProject(sProjName, false);
string installdirectory = "[ProgramFilesFolder]" + ePackName;
oISProj.INSTALLDIR = installdirectory;
Console.WriteLine("Adding ePack files");
for (int i = 0; i < aFiles.Length;i++ )
{
Console.WriteLine(aFiles[i]);
ISWiComponent NewComponent = oISProj.AddComponent("Component_"+i);
string string_PathToFile = aFiles[i].Substring(0,aFiles[i].LastIndexOf("\"));
string string_RelativeToInstallDir = string_PathToFile.Substring(aFiles[i].LastIndexOf(ePackName) + ePackName.Length);
NewComponent.Destination = installdirectory+string_RelativeToInstallDir ;
NewComponent.AddFile(aFiles[i]);
/*----------------------------Fails Here--------------------------------------*/
NewComponent.OverwriteMainOptions=0;
/*----------------------------------------------------------------------------*/
}
oISProj.SaveProject();
oISProj.CloseProject();
Console.WriteLine("Done");
}
static voidMain(string[] args){
ISWiAuto24.ISWiProject oISProj = new ISWiAuto24.ISWiProject();
string ePackName = "ThisMonthsBundle"
string[] aFiles = new[] {@"c:/Foo/Roo/Goo/"+ePackName+"/File0",@"c:/Foo/Roo/Goo/"+ePackName+"/File1",@"c:/Foo/Roo/Goo/"+ePackName+"/File2",@"c:/Foo/Roo/Goo/File3"}
string sProjName = "C:/Foo/Bar.ism"
oISProj.CreateProject(sProjName, ISWiProjectType.eptMsi);
AddFiles(aFiles,oISProj,sProjName);
}
有人知道解决这个问题的方法吗?
错误是:未处理 COM 异常 - Basic MSI 项目不支持此 属性。您需要从自动化代码中删除调用 属性 的行。
我在 2010 年的 flexera 社区论坛上发现了一个旧论坛 post,其中一位 flexera 开发人员回复用户说可以这样做:
ISWiComponent NewComponent = oISProj.AddComponent("Component_1");
NewComponent.Destination = "[ProgramFilesFolder]" + "ProgramName";
NewComponent.AddFile("c:\File1");
ISWiFiles Files = NewComponent.ISWiFiles;
foreach (ISWiFile File in Files)
{
File.OverrideSystemVersion = true;
File.Version = "65535.0.0.0";
}
有问题的开发人员认识到自动化界面需要支持 ISWiFile.AlwaysOverwrite 属性 并为此提出了工作指令。我想他们在
之后的 8 年里一直没有解决这个问题
无论如何,上面的方法似乎有效
我正在尝试为我工作的公司自动创建安装包,并且正在使用 Installshield Automation Interface 创建 MSI 项目。到目前为止,我们所做的其中一件事(如果您相信的话,是手动完成的)是在将它们导入 installshield 并将它们设置为 "Always overwrite" 之后逐个文件夹地检查我们要发布的所有文件,因为看来你不能在父文件夹上递归地做。在 installshield GUI 上创建基本 MSI 时,它允许您执行此操作,但是当通过 COM 对象创建 MSI 时,该选项似乎仅适用于 InstallScript,我无法使用它创建 MSI。
任何人我的代码有点像这样
static void AddFiles(string[] aFiles, ISWiAuto24.ISWiProject oISProj, string sProjName, string ePackName)
{
oISProj.OpenProject(sProjName, false);
string installdirectory = "[ProgramFilesFolder]" + ePackName;
oISProj.INSTALLDIR = installdirectory;
Console.WriteLine("Adding ePack files");
for (int i = 0; i < aFiles.Length;i++ )
{
Console.WriteLine(aFiles[i]);
ISWiComponent NewComponent = oISProj.AddComponent("Component_"+i);
string string_PathToFile = aFiles[i].Substring(0,aFiles[i].LastIndexOf("\"));
string string_RelativeToInstallDir = string_PathToFile.Substring(aFiles[i].LastIndexOf(ePackName) + ePackName.Length);
NewComponent.Destination = installdirectory+string_RelativeToInstallDir ;
NewComponent.AddFile(aFiles[i]);
/*----------------------------Fails Here--------------------------------------*/
NewComponent.OverwriteMainOptions=0;
/*----------------------------------------------------------------------------*/
}
oISProj.SaveProject();
oISProj.CloseProject();
Console.WriteLine("Done");
}
static voidMain(string[] args){
ISWiAuto24.ISWiProject oISProj = new ISWiAuto24.ISWiProject();
string ePackName = "ThisMonthsBundle"
string[] aFiles = new[] {@"c:/Foo/Roo/Goo/"+ePackName+"/File0",@"c:/Foo/Roo/Goo/"+ePackName+"/File1",@"c:/Foo/Roo/Goo/"+ePackName+"/File2",@"c:/Foo/Roo/Goo/File3"}
string sProjName = "C:/Foo/Bar.ism"
oISProj.CreateProject(sProjName, ISWiProjectType.eptMsi);
AddFiles(aFiles,oISProj,sProjName);
}
有人知道解决这个问题的方法吗?
错误是:未处理 COM 异常 - Basic MSI 项目不支持此 属性。您需要从自动化代码中删除调用 属性 的行。
我在 2010 年的 flexera 社区论坛上发现了一个旧论坛 post,其中一位 flexera 开发人员回复用户说可以这样做:
ISWiComponent NewComponent = oISProj.AddComponent("Component_1");
NewComponent.Destination = "[ProgramFilesFolder]" + "ProgramName";
NewComponent.AddFile("c:\File1");
ISWiFiles Files = NewComponent.ISWiFiles;
foreach (ISWiFile File in Files)
{
File.OverrideSystemVersion = true;
File.Version = "65535.0.0.0";
}
有问题的开发人员认识到自动化界面需要支持 ISWiFile.AlwaysOverwrite 属性 并为此提出了工作指令。我想他们在
之后的 8 年里一直没有解决这个问题无论如何,上面的方法似乎有效