1

以下のようにドライブの存在を確認するために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:\ドライブがあるターゲットマシンでmsiを実行するとインストールが成功し、ターゲットマシンにF:\ドライブがない場合はセットアップが失敗し、「セットアップウィザードがエラーのために途中で終了しました」というエラーが発生します。 。システムは変更されていません。

ここで実行しようとしているのは、ターゲットコンピューターでF:\ドライブが使用可能な場合(カスタムアクションが成功した場合)、ルートドライブを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">

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

このカスタムアクションを使用してルートドライブプロパティを設定するにはどうすればよいですか?助けてくれてありがとう!

4

3 に答える 3

2

session["PROPERTYNAME"]即時カスタムアクションを使用する場合は、カスタムアクションで使用できるように、を使用してプロパティ値を設定できsession["ROOTDRIVE"] = "F:\\";ます。

現時点で失敗している理由は、カスタムアクションから失敗メッセージを返しているためです。指定Return="check"したため、インストーラーは戻り値を確認し、カスタムアクションが失敗した場合はインストールに失敗します。

于 2013-01-24T11:36:23.370 に答える
0

あなたは正しい方向に進んでいます。これが私が違うことをすることです。

1)DriveInfoクラスを使用して、ドライブが存在し、DriveTypeFixedであるかどうかを確認します。(CDROM、USBドライブ、ネットワークではありません...)

2)カスタムアクションは、AppSearchの後にUIと実行シーケンスの両方でスケジュールされ、InstallDirOverrideなどのプロパティを設定します。カスタムアクションは常にActionResult.Successを返します。

3)プロパティの設定カスタムアクション(wxs要素)を使用して、INSTALLLOCATIONにまだ値がなく、InstallDirOverrideに値があるという条件で、InstallLOCATION(またはメインディレクトリと呼んでいるものは何でも)にInstallDirOverrideを割り当てます。とインストールされていません。このカスタムアクションは、CostInitializeの前にUIシーケンスとExecuteSequenceの両方でスケジュールされます。

このすべての結果は、デフォルトでC:\ Program Files \ My Company \ My Productになるインストーラーですが、C#カスタムアクションのビジネスルールに基づいて、デフォルトで別の動作に変更します。これにより、特定のプラットフォーム環境に必要なデフォルトの方法を柔軟に設定できますが、プラットフォームにそのリソースがない場合でも、Windows標準に準拠することができます。

于 2013-01-25T01:34:30.367 に答える
0

クリストファーペインタークリスパトリックに助けてくれてありがとう!!! 以下のコードは、うまくいくためのトリックを作りました。

 [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>
于 2013-01-30T13:08:27.480 に答える