1

かなり包括的なwixインストーラーmsiパッケージを開発しました。これには、10以上のc#カスタムアクションが含まれています。

私の問題は、プログラムでプロパティを「設定」する方法をまだ理解していないことです。

基本的に私がやりたいのは、既存のプロパティを新しいプロパティに解析することです。

この解析はc#で実行すると便利ですが、RegEx、JavaScript、またはw/eで実行することもできます。

ただし、c#カスタムアクション(「非即時カスタムアクションからセッションの詳細にアクセスできません」)からこれを行うことはできず、読み取ることができる限り、タイプ51カスタムアクションからのみプロパティを変更できます。ただし、タイプ51は私のc#カスタムアクションを使用できません。だからそのキャッチ22。

誰かがwixで次のことを実行する方法の例を教えてもらえますか:あるプロパティの値を使用して正規表現/文字列操作を実行し、その結果で別のプロパティを設定します。

これが可能であることは私には明らかなようですが、多くの検索の後、私はまだ暗闇の中にいます。

どんな助けでもいただければ幸いです。


編集#1:wixで3年間働いた後も、私はまだアマチュアのように感じますが、ここに行きます:プロパティを送信してカスタムアクションでそれらを操作する唯一の方法は次のパターンだと思いました:

 <CustomAction Id="CA.SetCreateMessageQueueProperty"
                  Property="CA.CreateMessageQueue"
                  Value="MsmqData=.\Private$\[MYAPPLICATIONNAME]/ObservationReportingService.svc,Observation delivery queue"
                  Return="check"/>
    <CustomAction Id="CA.CreateMessageQueue" 
                  BinaryKey="BI.CA" 
                  DllEntry="CreateMessageQueue" 
                  Execute="deferred" 
                  Return="check"
                  Impersonate="no"/>
    <InstallExecuteSequence>
      <Custom Action="CA.SetCreateMessageQueueProperty"
              After="InstallFiles"/>
      <Custom Action="CA.CreateMessageQueue" After="CA.SetCreateMessageQueueProperty">
        <![CDATA[((&FE.Afs=3) AND NOT (!FE.Afs=3))]]>
      </Custom>
    </InstallExecuteSequence>

カスタムアクションc#アセンブリでは、次のようになります。

[CustomAction]
        public static ActionResult CreateMessageQueue(Session session)
        {
            return session.DoCustomAction("CreateMessageQueue",
                () =>
                    {
                        string msmqData = session.ExtractString("MsmqData");

                        //create actual message queue
                            }
                        }
                    });
        }

internal static ActionResult DoCustomAction(this Session session, string name, Action action)
        {
            session.Log("Begin " + name);
            session.Log("session.CustomActionData.Count:" + session.CustomActionData.Count);
            try
            {
                action.Invoke();
            }
            catch (Exception ex)
            {
                session.Log(string.Format("Exception: {0}\nInner Exception: {1}", ex, ex.InnerException));
                return ActionResult.Failure;
            }
            return ActionResult.Success;
        }
4

2 に答える 2

2

延期されたカスタムアクション中に、既存のプロパティを取得して新しいプロパティに割り当てようとしていると思います。

<CustomAction Id="SetProperty" Return="check" Property="NameOfCustomActionYouAreUsingToRetrieveProperty" Value="[PROPERTY]"></CustomAction>

の遅延カスタムアクションInstallExecuteSequenceはインストーラープロパティにアクセスできないため、プロパティをに追加する必要がありますCustomActionData

カスタムアクションをC++で記述しましたが、コードを投稿すると、C#コードに変更するアイデアが得られます。

extern "C" UINT __stdcall NameOfCustomActionYouAreUsingToRetrieveProperty(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
LPWSTR szValueBuf = NULL;

hr = WcaInitialize(hInstall, "NameOfCustomActionYouAreUsingToRetrieveProperty");
ExitOnFailure(hr, "Failed to initialize");

WcaLog(LOGMSG_STANDARD, "Initialized.");

hr = WcaGetProperty(L"CustomActionData",&szValueBuf);
ExitOnFailure(hr, "failed to get CustomActionData");

hr = MsiSetProperty(hInstall, "NEWPROPERTY",  szValueBuf);
ExitOnFailure(hr, "failed to set the new property");

LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);     
}
于 2013-02-13T09:22:12.893 に答える
1

C#では、コードは次のようになります。

[CustomAction]
public static ActionResult MyCustomAction(Session session)
{
  string property = session["PROPERTYNAME"];
  session["PROPERTYNAME"] = "Look at me!";
  return ActionResult.Success;
}

オブジェクトは、sessionインストールデータベースとそのすべてのテーブルにアクセスできます。また、そのインデクサーを使用して、プロパティテーブル内の任意のプロパティを取得および設定できます。

また、.NETランタイムを説明する小さな.configファイルが必要です。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
</configuration>

とを使用するC++の代替手段よりもはるかにクリーンです。MsiGetPropertyMsiSetProperty

うまくいけば、これが役立ちます。このWiXチュートリアル、特にこのページで私が書いたすべてのものを見つけることができます。

于 2013-02-12T22:23:50.397 に答える