0

Windows Installer Embedded チェーンを使用して複数の .msi をインストールしようとしています。ウェブサイトからいくつかの情報を調査し、試してみました。しかし、うまくいきません ( WiX + C# )。

  1. デバッグを確認したところ、 と まで正常に動作しtransaction.Commit()ますtransaction.close()。しかしSampleApp.msi、インストールしませんでした。
  2. 'Multiple MISs Installer' は正常にインストールされましたが、動作SampleApp.msiしませんでした。'Multiple MISs Installer' をアンインストールできません。エラー ログのエントリは「インストール中の致命的なエラー」です。

どうすれば修正できますか?

複数の MSI Installer\Product.wxs

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="INSTALLLOCATION" Name="Multiple Installer">
            <Component Id="InstallMSIComponent" Guid="{7091DE57-7BE3-4b0d-95D5-07EEF6463B62}">
                <File Id="FILE_MprjChainer.exe" Name="MprjChainer.exe"
                      Source="C:\A_VS2008\WiX\MprjChainer\MprjChainer\bin\Debug\MprjChainer.exe"
                      DiskId="1" KeyPath="yes"/>
                <File Id="Microsoft.Deployment.WindowsInstaller.dll"
                      Name="Microsoft.Deployment.WindowsInstaller.dll"
                      Source="C:\Program Files\Windows Installer XML v3.5\SDK\Microsoft.Deployment.WindowsInstaller.dll" />
                <File Id="System.dll"
                      Name="System.dll"
                      Source="C:\windows\Microsoft.NET\Framework\v2.0.50727\System.dll" />
                <File Id="System.Core.dll" Name="System.Core.dll"
                      Source="C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" />
                <File Id="System.Windows.Forms.dll" Name="System.Windows.Forms.dll"
                       Source="C:\windows\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll" />
                <File Id="System.Xml.dll"
                      Name="System.Xml.dll"
                      Source="C:\windows\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll" />
                <File Id="System.Xml.Linq.dll"
                      Name="System.Xml.Linq.dll"
                      Source="c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Xml.Linq.dll" />
                <RemoveFolder Id="INSTALLLOCATION" On="uninstall"/>
            </Component>

            <Component Id="CMPG_SimpleApp" Guid="{CB568AA4-9790-4efd-91BB-82682F063321}">
                <File Id="SimpleApp.msi"
                      Name="SimpleApp.msi"
                      Source="C:\A_VS2008\WiX\MSIs\SimpleApp.msi"
                      DiskId="1" KeyPath="yes"/>
            </Component>
        </Directory>
    </Directory>
</Directory>

<EmbeddedChainer Id="Chainer" FileSource="FILE_MprjChainer.exe"/>

<Feature Id="ProductFeature" Title="MPrjInstaller" Level="1">
    <ComponentRef Id="InstallMSIComponent"/>
    <ComponentRef Id="CMPG_SimpleApp"/>
    <ComponentGroupRef Id="Product.Generated" />
</Feature>

Chainer\CustomAction.cs

namespace MprjChainer
{
    public class CustomActions
    {
        static void Main(string[] args)
        {
            System.Diagnostics.Debugger.Launch();

            try
            {
                IntPtr ptr = new IntPtr(Convert.ToInt32(args[0], 16));
                Transaction transaction = Transaction.FromHandle(ptr, true);

                transaction.Join(TransactionAttributes.JoinExistingEmbeddedUI);

                transaction.Commit();
                transaction.Close();
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show("e.Message; " + e.Message);
                throw e;
            }
        }

        [CustomAction]
        public static ActionResult CustomAction1(Session session)
        {
            System.Diagnostics.Debugger.Launch();
            session.Log("Begin CustomAction1");

            return ActionResult.Success;
        }
    }
}
4

2 に答える 2

0

InstallProduct() を呼び出してみてください:

transaction.Join(TransactionAttributes.JoinExistingEmbeddedUI);

// start another installation in the same transaction
Installer.InstallProduct(@"path_To_Your_MSI", arguments);   
// it's good to include /l*v install.log in the arguments so that you'll get a verbose log of the installation

transaction.Commit();

Embedded Chainer の例は、 WiX EmbeddedChainer Examples?で見ることができます。

複数の msi パッケージをチェーンするための Burn (Wix のブートストラップ/チェイナー) も参照できます: http://robmensching.com/blog/posts/2009/7/14/Lets-talk-about-Burn

于 2012-04-26T06:03:11.753 に答える
0

C# コードにバグがあります: "IntPtr ptr = new IntPtr(Convert.ToInt32(args[0], 16));" という行にあります。「16」は「10」でなければなりません!

そうしないと、トランザクションが 10 個を超える場合 (たとえば、組み込みチェイナーから呼び出されたサブ msi が 5 つ以上ある場合) に、「無効なハンドル」エラーが発生します。

于 2013-08-08T09:56:26.770 に答える