我正在自定义默认模板,以便在构建期间自动更新Install Shield项目的生产版本和产品代码。哪个在本地机器上工作正常?
但是通过TFS Build它给出了一个例外
异常消息:检索组件的COM类工厂 CLSID {52BA76F5-D0A7-4F2E-BD4A-45F8F2CE6A55}由于 以下错误:80040154类未注册(异常来自 HRESULT:0x80040154(REGDB_E_CLASSNOTREG))。 (输入COMException)
我的TFS Build服务器是64位服务器。 以下是自定义活动代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
using System.Text.RegularExpressions;
using Microsoft.TeamFoundation.Build.Client;
using Microsoft.TeamFoundation.Build.Workflow.Activities;
using Microsoft.TeamFoundation.VersionControl.Client;
using ISWiAuto20;
namespace InstallShieldBuildTask.Activities
{
[BuildActivity(HostEnvironmentOption.All)]
public sealed class IncreaseProductVersion : CodeActivity
{
// The file mask of all files for which the buildnumber of the
// AssemblyVersion must be increased
[RequiredArgument]
public InArgument<string> InstallShieldFileMask { get; set; }
[RequiredArgument]
public InArgument<bool> UpdateProductVersion { get; set; }
[RequiredArgument]
public InArgument<bool> UpdateProductCode { get; set; }
// The SourcesDirectory as initialized in the Build Process Template
[RequiredArgument]
public InArgument<string> SourcesDirectory { get; set; }
// If your activity returns a value, derive from CodeActivity<TResult>
// and return the value from the Execute method.
protected override void Execute(CodeActivityContext context)
{
// Obtain the runtime value of the input arguments
string sourcesDirectory = context.GetValue(this.SourcesDirectory);
string installShieldFileMask = context.GetValue(this.InstallShieldFileMask);
var updateProductVersion = context.GetValue(this.UpdateProductVersion);
var updateProductCode = context.GetValue(this.UpdateProductCode);
foreach (string file in Directory.EnumerateFiles(sourcesDirectory, installShieldFileMask, SearchOption.AllDirectories))
{
if (updateProductVersion || updateProductCode)
{
ISWiProject oISWiProj = new ISWiProject();
//Opne the file to read
oISWiProj.OpenProject(file, false);
if (updateProductVersion)
{
var currentProductVersion = oISWiProj.ProductVersion;
Version version = new Version(currentProductVersion);
Version newVersion = new Version(version.Major, version.Minor, version.Build + 1, version.Revision);
oISWiProj.ProductVersion = newVersion.ToString();
}
if (updateProductCode)
{
oISWiProj.ProductCode = oISWiProj.GenerateGUID();
}
oISWiProj.SaveProject();
oISWiProj.CloseProject();
}
}
}
}
}
我看了下面的链接,但没有成功:
任何有关这方面的帮助对我都有帮助。谢谢!
@Update 替代解决方案
谢谢克里斯!
根据您的指示,我使用了MS Build FunctionPropertise来实现这一目标。
这是我的 .ISPORJ文件
<PropertyGroup>
<InstallShieldProductVersion>$(ProductVersion)</InstallShieldProductVersion>
</PropertyGroup>
<ItemGroup>
<InstallShieldPropertyOverrides Include="{$([System.Guid]::NewGuid().ToString().ToUpper())}">
<Property>ProductCode</Property>
</InstallShieldPropertyOverrides>
</ItemGroup>
ProductVersion我正在通过Team Build传递MSbuild参数。
答案 0 :(得分:1)
InstallShield支持MSBuild。 MSBuild现在支持Property Functions(通过在.NET类上调用静态方法来获得价值的属性)。这意味着现在很容易生成GUID并将其分配给ProductCode。
InstallShield确实需要32位MSBuild平台,这可以通过构建定义参数进行配置。
只使用默认的构建过程模板就可以完全自动化InstallShield构建。无需自定义工作流程开发。也不需要调用InstallShield Automation Interface的自定义MSBuild任务。
如果您想要一个屏幕分享会话,请随时给我发电子邮件。
答案 1 :(得分:0)
您是否在构建服务器上安装了InstallShield SDK或安装的产品,就像在开发机器上那样?
答案 2 :(得分:0)
默认情况下,Team Build运行64位进程,除非您将其安装在Windows 8 32位客户端上。这可能会让您解决您的问题。您还必须在Build Agent上安装InstallShield。
或者,创建一个包含活动中逻辑的x86命令行可执行文件。从“自定义活动”调用命令行实用程序,并使用命令行参数将活动中的参数提供给控制台应用程序。