7

次のようにコマンド引数を渡すことで、MSI を使用して Windows アプリケーションをアンインストールできます。

Process p = new Process(); 
p.StartInfo.FileName = "msiexec.exe"; 
p.StartInfo.Arguments = "/x \"C:\\MyApplication.msi\"/qn"; 
p.Start(); 

しかし、私が知りたいのは、MSI を使用せずにアプリケーションをアンインストールする方法です。上記のシナリオでは、このアプリケーションをアンインストールする特定の場所に MSI を配置する必要があります。製品コードを使用してアンインストールできる場合は、ターゲット マシンに MSI を配置する必要はありません。

4

4 に答える 4

7

MSDNによると、製品コードを使用してアンインストールできます。

msiexec.exe /x {your-product-code-guid}

製品コードを使用すると、 からキャッシュされた MSI が使用されC:\WINDOWS\Installerます。

于 2013-07-08T10:15:35.617 に答える
6

PhilmE の回答に沿って、Windows Installer XML (WiX) は、Deployment Tools Foundation (DTF) の一部として Microsoft.Deployment.WindowsInstaller 相互運用ライブラリを出荷しています。これにより、COM 相互運用がスキップされ、代わりに Win32 API がカプセル化されます。

using Microsoft.Deployment.WindowsInstaller;

public static void Uninstall( string productCode)
{
    Installer.ConfigureProduct(productCode, 0, InstallState.Absent, @"REBOOT=""R"" /l*v uninstall.log");
}
于 2013-07-08T20:37:08.183 に答える
4

おそらくあなたの場合、「/ x」パラメーターを知っていれば十分です。それに関する 2 つの注意点: コマンドラインに "REBOOT=R" 部分を追加すると、より安全になります。また、ログファイルのパスを追加できます:

msiexec /x "..." /qn REBOOT=R /L*v "c:\mylogdir\mymsi.log"

第二に、「キャッシング」に何かを変更しようとしないでください。理解する必要すらない。キャッシュされたパッケージが破損すると、通常のアンインストールができなくなり、コンピューターが「サポートが必要」な状態になる可能性があります。

あなたの質問はもともと C# について話していたので.. msiexec を使用する必要はありません:

a) MsiInstallProduct() または MsiConfigureProduct() 関数で元の C/C++ API を使用します。MSDN 参照: http://msdn.microsoft.com/en-us/library/windows/desktop/aa370315(v=vs.85).aspx

C# でこれを使用するには、interop を使用する必要があります。

または b) Windows インストーラー オブジェクトを使用します。たとえば、この関連するケースは、stackoverflow で既に回答されています: プログラムによる MSI パッケージのインストール しかし、この機能を使用するには、アンインストールにも物理パッケージが必要です。少し間接的ですが、アンインストールのためのより良いコードは次のとおりです。

まず、COM オブジェクト "Microsoft Windows Installer Object Library" への参照をプロジェクトに追加します。

using WindowsInstaller;


public static class MyMsiLib
{
    public static void Uninstall(string productCode)
    {

         Type type = Type.GetTypeFromProgID("WindowsInstaller.Installer");
         Installer installer = (Installer)Activator.CreateInstance(type);
         installer.UILevel=msiUILevelNone;
         installer.ConfigureProduct(productCode, 0, msiInstallStateAbsent);
    }
}

以前の UILevel プロパティは、必要に応じてサイレント UI レベルを決定するためにここでハードコードされています。他の物件も同様。上記のリンクに記載されている MSDN のドキュメントなどを参照してください。

もちろん、「本物のプログラマー」は「インストーラー オブジェクト」ではなくオリジナルの API を使用します :-) しかし、小さな目的であればそれで十分です。そして簡単に。

于 2013-07-08T19:51:30.967 に答える
2

このコマンドはコマンド ラインで機能します。

msiexec /x {3A40307D-6DF2-4412-842F-B1D848043367} /quiet

C# で試したことはありませんが、引数を上記のキーに置き換えるとうまくいくはずです。アンインストールしようとしているアプリのレジストリ キーで GUID を見つけることができます。

于 2013-07-08T10:16:56.760 に答える