InstallInitialize之后的自定义操作以检查驱动器存在

时间:2013-01-24 10:27:00

标签: installer wix wix3.5

我已经在C#中编写了一个自定义操作来检查驱动器是否存在,如下所示,我陷入其间。

 [CustomAction]
    public static ActionResult MySimpleAction(Session session)
    {        
        if (Directory.Exists("F:\\"))
        {
            return ActionResult.Success;
        }
        else
        {
            return ActionResult.Failure;
        }
    }

在wxs文件中,我正在运行自定义操作,如下所示。

 <Binary Id="myAction" SourceFile="MyCustomAction.CA.dll" />
 <CustomAction Id="myActionId"
                  BinaryKey="myAction"
                  DllEntry="MySimpleAction"
                  Execute="immediate"
                  Return="check" />

<InstallExecuteSequence>
  <Custom Action="myActionId" After="InstallInitialize"  >  </Custom> 
</InstallExecuteSequence>

如果我在目标机器上运行msi,我有F:\驱动器然后安装成功,如果目标机器没有F:\驱动器然后安装失败,我收到错误“安装向导由于错误而提前结束。您的系统尚未修改。

我在这里要做的是,如果目标计算机中有F:\驱动器可用(我的自定义操作成功),我想将我的根驱动器设置为F:\,并且我想安装应用程序F:\ MyApp的\滨

     <Property Id="ROOTDRIVE"><![CDATA[F:\]]></Property>
     <Directory Id="TARGETDIR" Name="SourceDir">
       <Directory Id="INSTALLFOLDERLOCATION" Name="MyApp">
        <Directory Id="INSTALLLOCATION" Name="Bin">

如果目标计算机中没有F:\驱动器(我的自定义操作失败),我想将我的根驱动器设置为C:\,我想安装在C:\ MyApp \ Bin

     <Property Id="ROOTDRIVE"><![CDATA[C:\]]></Property>
      <Directory Id="TARGETDIR" Name="SourceDir">
       <Directory Id="INSTALLFOLDERLOCATION" Name="MyApp">
        <Directory Id="INSTALLLOCATION" Name="Bin">

如何使用此自定义操作设置根驱动器属性? 谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

使用即时自定义操作时,您可以使用session["PROPERTYNAME"]设置属性值,因此在您的情况下,您可以在自定义操作中使用session["ROOTDRIVE"] = "F:\\";

目前失败的原因是您从自定义操作返回失败消息,并且由于您指定了Return="check",安装程序会检查返回值,如果自定义操作具有自定义操作,则安装失败失败。

答案 1 :(得分:0)

你走在正确的轨道上。这是我的不同之处。

1)我使用DriveInfo类来查看驱动器是否存在以及它是DriveType Fixed。 (不是CDROM,USB驱动器,网络......)

2)自定义操作在AppSearch之后的UI和Execute序列中进行调度,并设置一个名为InstallDirOverride的属性。自定义操作始终返回ActionResult.Success。

3)我使用Set Property自定义操作(wxs元素)将InstallDirOverride分配给INSTALLLOCATION(或INSTALLDIR ......无论你有什么称为主目录),条件是INSTALLLOCATION还没有值,InstallDirOverride会有一个值并且未安装。此自定义操作在CostInitialize之前的UI序列和ExecuteSequence中进行调度。

所有这些的结果是默认为C:\ Program Files \ My Company \ My Product的安装程序,但根据C#自定义操作中的业务规则将其行为更改为默认值。这使您可以灵活地以特定平台环境的方式进行默认设置,但当您的平台缺少该资源时仍然会对Windows标准抱怨。

答案 2 :(得分:0)

我感谢 Christopher Painter ChrisPatrick 帮助我!!!以下代码使诀窍起作用。

 [CustomAction]
    public static ActionResult MySimpleAction(Session session)
    {
        session.Log("DriveInfo Starts");
        DriveInfo[] drives = DriveInfo.GetDrives();
        foreach (DriveInfo d in drives)
        {
            if (d.Name.Contains("F") & d.IsReady == true & d.DriveType.ToString() == "Fixed")
            {                   
              session["TARGETDIR"] = "F:\\";                   
            }
            else
            {
                session["TARGETDIR"] = "C:\\";
                session.Log("No F:\\ Drive Found!!!!");                    
            }
        }
        session.Log("DriveInfo Ends");
        return ActionResult.Success;

在.wxs文件中,

  <Binary Id="myAction" SourceFile="MyCustomAction.CA.dll" />

   <Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="INSTALLFOLDERLOCATION" Name="MyApp">
    <Directory Id="INSTALLLOCATION" Name="Bin">

     <CustomAction Id="myActionId" BinaryKey="myAction" DllEntry="MySimpleAction" Execute="immediate" Return="check" />

      <InstallUISequence>
      <Custom Action="myActionId" Before="CostFinalize" > NOT Installed </Custom>      
      </InstallUISequence>