あまりにも多くの実験を経て、Windowsインストーラーは単に悪い技術であるという結論に達しました。しかし、顧客はMSIファイルを望んでいます。
したがって、EXEファイルを一時ディレクトリに抽出し、EXEファイルに渡されたのと同じまたは類似のオプションで実行するMSIファイルを作成するにはどうすればよいですか?
MSIのオプションについては、Msiexec(コマンドラインオプション)(MSIの低レベルの「実行」はmsiexecです)オプションpackage.msi)。
編集:mjmarshのWiXソリューションは機能しているように見えます。まだ試してみる機会がありません(クランチタイム)。それが機能する場合、私はそれを受け入れます。
編集:それは動作しません。欠品:出席済み/無人は利用できないようです。
とにかく、この動作をまったく行わないのは、カスタムアクションが親プロセスを強制終了することだけです!
編集:だから誰かがインストール後のカスタムアクションとして全体を包むさらなる回答として投稿しました。理論的には可能ですが、再起動が必要になる場合があるため(MS for .NET 4には再起動が必要な場合があります)、さらにハッカーを行う必要があります。利点のマトリックスから:
Transparency: No. One big custom action.
Customizability: No.
Standardization: No.
Management and reporting: No. Appears to work but will not.
Security: No benefit.
Validation: No. The hackery required to survive reboot makes this sure to not work.
Resiliency: Completely defeated.
Rollback: No. Rollback didn't work when we were using MSI anyway.
Patching & Updates: No. We have a local solution anyway.
Logging: No. Appears to work but will not.
意味が無い。
解決策はありません。とにかく、MSIネスティングの問題により、MSIの企業インストールが壊れるので、NSISに行きました(ちょうどtry MSIの内部からMSIをラップするEXEをいつかインストールするだけです)。
さて、無料の方法と$$$$の方法があります。ここですべてを文書化することはできませんが、これで開始できます。
ちなみに、はい、Windowsインストーラーは厄介なテクノロジーです。タスクは簡単だと思うことが多いですが、実際には複雑になります。あなたは間違いなくそれを理解するために没頭する必要があります。
いずれにせよ、ここに行きます:
無料:WiX( here )
これは、XML構成ファイルのセットからMSIファイルを生成する無料のツールです。オンラインでチュートリアルを見つけることができますが、重要な点は次のとおりです。
WXSファイルで次のタグを使用して、EXEをインストーラーに圧縮できます。
<Binary Id="MYEXE" src="<path to my exe?"/>
次に、EXEファイルを起動するカスタムアクションを作成できます。
<CustomAction Id="EXECA_CALLMYEXE" Return="check" Execute="deferred" BinaryKey="MYEXE"
ExeCommand="my command line"/>
次に、カスタムアクションを適切な場所のInstallExecuteSequence
に挿入します(ほとんどの場合、InstallInitialize
とInstallFinalize
の間のどこかで実行します)
<InstallExecuteSequence>
<Custom Action="EXECA_CALLMYEXE" After="InstallInitialize"><![CDATA[Not REMOVE]]></Custom>
$$$:Get InstallShield( [〜#〜] here [〜#〜] )
最初に「Basic MSI」プロジェクトを作成し、希望することを確認してくださいno setup.exe generated。これはリリース設定で設定します。
次に、基本的にWiXと同じことを行いますが、UIがあります。
InstallExecuteSequence
とInstallInitialize
の間のInstallFinalize
にカスタムアクションを挿入することができます。申し訳ありませんが、これ以上詳しく説明することはできませんでしたが、これは良い出発点です。
ジョシュア、私はあなたの不満をとてもよく理解しています。 MSIは控えめに言っても風変わりです-展開を考えるまったく新しい方法です。それでも、MSIを適切に適用すると、特に企業のお客様に最適な展開が可能になります。
インストーラーEXEはどのような操作を実行しますか?主にファイルのコピー、一部のCOM登録、一部のレジストリの書き込み、または複雑なインストールロジックの実行、データベースのセットアップなどを行いますか?私が尋ねる理由は、おそらくあなたのためにうまく機能するWIX MSIを作成するのが非常に迅速であるため、EXEアプローチを放棄できるからです。
MSI内からEXEを実行することは確かに可能ですが、適切なシーケンスが必要であり、単純なMSIよりも多くのブルーが発生することが保証されています。アプリが小さく、インストール中に何も狂わない場合、基本的なWIX変換を喜んで提供します。
weir's
回答に追加して、custom action attribute
を次のように変更します。
<!--Run Action-->
<CustomAction Id="RunWrappedExe"
Return="asyncNoWait"
FileKey="ApplicationFileId"
Execute="deferred"
ExeCommand=""
HideTarget="no"
Impersonate="yes"/>
Return=asyncNoWai
を設定しても、exe
が戻るのを待ちません。インストーラーはそれを実行し、正常に閉じます。その間、exe
はその実行を継続します。
-マドレーシュ
MSI Wrapperの無料バージョン もあります。また、アンインストールとアップグレードもサポートしています。また、プログラムの追加または削除でエントリを1つだけ作成します。
Wixでできます。 wix 3.5のサンプルコードを次に示します。
<?xml version='1.0'?>
<Wix xmlns='http://schemas.Microsoft.com/wix/2006/wi'>
<Product Id='*' UpgradeCode="11111111-2222-3333-4444-555555555555"
Name='My Setup' Language='1033' Version='1.0.0.0'
Manufacturer='Your company'>
<Package Description='pak' InstallerVersion='200' Compressed='yes' />
<Media Id='1' Cabinet='setup.cab' EmbedCab='yes' />
<Directory Id='TARGETDIR' Name='SourceDir'>
<Directory Id="TempFolder">
<Directory Id="INSTALLLOCATION" Name="~_tmpdir">
<Component Id='MyComponent' DiskId='1' Guid=''>
<File Id="File0" Name="setup.exe" Source="setup.exe" />
<File Id="File1" Name="file1.txt" Source="file1.txt" />
</Component>
</Directory>
</Directory>
</Directory>
<Feature Id='InstallFeature' Title='Install Feature' Level='1'>
<ComponentRef Id='MyComponent' />
</Feature>
<!-- Run Action -->
<CustomAction Id="RunWrapExe" Return="ignore" Execute="deferred"
FileKey="File0" ExeCommand="setup.exe param here"
HideTarget="no" Impersonate="no" />
<InstallExecuteSequence>
<Custom Action="RunWrapExe"
After="InstallFiles">NOT REMOVE~="ALL"</Custom>
</InstallExecuteSequence>
</Product>
</Wix>
MSIを管理したくないが、EXEのみを実行する場合は、 MSI Converter Freeへの実行 を試してください。 EXEへのパスを入力して、MSIを取得します。
これを試して:
MSIパッケージには、「インストール後にアプリケーションを起動する」という動作呼び出しがあります。つまり、MSIのインストール後にMexeファイルが実行されます(MSIが閉じられます)。
そこでexeを実行して、exeが他のMSIパッケージを呼び出すときに、最初のパッケージと競合しないようにしてください。
私は同じ問題を抱えていました(EXEをラップし、.netセットアップなどを含むEXEから他のMSIを呼び出します)、私の解決策は次のとおりです:
InstallAwareを使用してセットアップexeをビルドします。生成されたEXEをMSIでラップする独自のMSIラッパーがあります。
それは問題なく動作し、EXEは問題なく他のMSI(.netセットアップ、他のサードパーティセットアップを含む)を呼び出すことができますが、それはMSIの起動がセットアップEXEファイルの起動後に権利を終了(「戻る」)するためです。再帰的なMSI呼び出しのMSI制限を回避します。
ただし、MSI展開ツールを使用する一部のお客様(企業)では、セットアッププロセスの終了後にのみMSI(msiexec)が戻る(終了する)必要があり、これは上記のソリューションの問題です。
だから-これを解決するには:
EXEセットアップの終了後にのみ戻るMSIを生成する別のMSIラッパー(exemsi.com)がありますが、それを使用するには、InstallAwareの別の一意のオプションを使用する必要があります。
InstallAwareには、MSIの再帰的な制限を回避するために、Windows Installerエンジンに基づいていない独自のネイティブエンジンを使用してEXEセットアップを生成するオプションがあります。両方を組み合わせれば、完璧なソリューションが得られます。
この質問が誰かに役立つことを願っていますが、この質問が最初に投稿されてから何年も経ちました。