Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Installation 安装后的自定义操作初始化以检查驱动器是否存在_Installation_Wix_Wix3.5 - Fatal编程技术网

Installation 安装后的自定义操作初始化以检查驱动器是否存在

Installation 安装后的自定义操作初始化以检查驱动器是否存在,installation,wix,wix3.5,Installation,Wix,Wix3.5,我在C#中编写了一个自定义操作,以检查驱动器是否存在,如下所示,我被夹在中间 [CustomAction] public static ActionResult MySimpleAction(Session session) { if (Directory.Exists("F:\\")) { return ActionResult.Success; } else

我在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>

如果我在有F:\drive的目标计算机上运行msi,则安装成功;如果目标计算机没有F:\drive,则安装失败,则会出现错误,因为“安装向导因错误而提前结束。您的系统尚未修改。

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

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

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

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

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

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


目前它失败的原因是,您正在从自定义操作返回一条失败消息,并且由于您指定了
Return=“check”
,安装程序将检查返回值,如果自定义操作失败,安装将失败。

您的操作是正确的。以下是我的不同做法

1) 我使用DriveInfo类来查看驱动器是否存在,是否属于DriveType Fixed。(不是CDROM、USB驱动器、网络……)

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

3) 我使用Set属性自定义操作(wxs元素)将InstallDirOverride分配给INSTALLLOCATION(或INSTALLDIR…无论您调用的主目录是什么),条件是INSTALLLOCATION没有值,而InstallDirOverride有值且未安装。在CostInitialize之前,此自定义操作将在UI序列和ExecuteSequence中进行调度


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

我感谢Christopher PainterChrisPatrick对我的帮助!!!下面的代码使这个技巧起作用

 [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>

未安装

希望得到更完整的代码文件。目录不允许有CustomAction元素:-(