インストール状態ファイルの情報をインストーラクラスに渡してアンインストールします。InstallStateファイルを逆シリアル化できますか?
しかし、それを渡す前に、情報をSystem.Collections.IDictionary savedStateに変換する必要があります。
このため、インストール状態ファイルをデシリアライズできますか?
Screenshot of the Installstate file
インストール状態ファイルの情報をインストーラクラスに渡してアンインストールします。InstallStateファイルを逆シリアル化できますか?
しかし、それを渡す前に、情報をSystem.Collections.IDictionary savedStateに変換する必要があります。
このため、インストール状態ファイルをデシリアライズできますか?
Screenshot of the Installstate file
あなたがAssemblyInstallerクラスを使用している場合は、それが、それは、一般的には、任意の合格savedState
パラメータを無視すること(これは文書化されていないようですが)を表示され、代わりにINSTALLSTATE
に対処します代わりにファイル(インストール中に書き込む、アンインストール時に読み込む)。
何らかの理由でそれを使用できない場合は、逆アセンブリツールを使用して、Uninstall
メソッドから必要なコードを抽出してデシリアライズを実行することができます(おそらく、特定のシリアライゼーション使用されるメソッドは.NETのバージョンによって異なりますので、現在作業している.NETバージョンのいずれかに適切なものを使用することをお勧めします)。
この
はSystem.Configuration.Installから逆コンパイルUninstall
方法、(ファイルバージョン4.6.1590.0)です:
public override void Uninstall(IDictionary savedState)
{
this.PrintStartText(Res.GetString("InstallActivityUninstalling"));
if (!this.initialized)
{
this.InitializeFromAssembly();
}
string installStatePath = this.GetInstallStatePath(this.Path);
if ((installStatePath != null) && File.Exists(installStatePath))
{
FileStream input = new FileStream(installStatePath, FileMode.Open, FileAccess.Read);
XmlReaderSettings settings = new XmlReaderSettings {
CheckCharacters = false,
CloseInput = false
};
XmlReader reader = null;
if (input != null)
{
reader = XmlReader.Create(input, settings);
}
try
{
if (reader != null)
{
NetDataContractSerializer serializer = new NetDataContractSerializer();
savedState = (Hashtable) serializer.ReadObject(reader);
}
goto Label_00C6;
}
catch
{
object[] args = new object[] { this.Path, installStatePath };
base.Context.LogMessage(Res.GetString("InstallSavedStateFileCorruptedWarning", args));
savedState = null;
goto Label_00C6;
}
finally
{
if (reader != null)
{
reader.Close();
}
if (input != null)
{
input.Close();
}
}
}
savedState = null;
Label_00C6:
base.Uninstall(savedState);
if ((installStatePath != null) && (installStatePath.Length != 0))
{
try
{
File.Delete(installStatePath);
}
catch
{
object[] objArray2 = new object[] { installStatePath };
throw new InvalidOperationException(Res.GetString("InstallUnableDeleteFile", objArray2));
}
}
}
あなたはそれに渡されたものは何でも使用していないことに気づくでしょうsavedSate
として、その変数を何か(ここでは、その基底クラスに渡す)で使用するときは、INSTALLSTATE
ファイルから上書きするか、null
に割り当てます。
AssemblyInstallerアンインストールメソッドはnullを渡すことができないIDictionary savedStateをとります。 – Sandy
@Sandy - 誰が言ってるの?私が見ているバージョンは、 'null'として渡された場合、' ArgumentNullException'を送出しません。そして、私が言うように、それは常に 'INSTALLSTATE'ファイルをデシリアライズしたり、*ヌルに設定したりして、与えられた値を常に上書きします。 –
上記のコードで、私はInstallStateファイルを逆シリアル化することができました。 しかし、これをAssemblyInstallerのUninstallメソッドに渡すと、オブジェクトのrefereceがインスタンス例外に設定されていません。 私はこの状態をインストーラクラスを持つDllに渡すかのように "savedState辞書には一貫性のないデータが含まれており、破損している可能性があります。" ただし、コントロールパネルからMSIを正しくアンインストールすることができます。 – Sandy
ファイルはどのように見えますか?コードは書いてありますか? –
このファイルの外観はわかりません。それがxmlまたはjsonなら、それは可能です。 C#でxmlとjsonをデシリアライズする例がいくつかあります。 –
これはXMLファイルですが、逆シリアル化できません。 ファイルの先頭が <?xml version = "1.0" encoding = "utf-8"?> 0.72 <バージョンz:Id = "3" z:タイプ= "System.Int32" z:アセンブリ= "0" xmlns = ""> 2 –
Sandy