升级TFS构建模板以自动化已安装的Shield项目

时间:2014-01-06 13:25:07

标签: visual-studio-2012 build tfs2012 installshield

我正在自定义默认模板,以便在构建期间自动更新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();

                    }

                }

        }
    }
}

我看了下面的链接,但没有成功:

http://community.flexerasoftware.com/showthread.php?195743-Integrating-Installshield-2011-with-Team-Foundation-Server-(TFS)-2010&p=464354#post464354

任何有关这方面的帮助对我都有帮助。谢谢!

@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参数。

3 个答案:

答案 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命令行可执行文件。从“自定义活动”调用命令行实用程序,并使用命令行参数将活动中的参数提供给控制台应用程序。