2016-08-25 7 views
0

インストール状態ファイルの情報をインストーラクラスに渡してアンインストールします。InstallStateファイルを逆シリアル化できますか?

しかし、それを渡す前に、情報をSystem.Collections.IDictionary savedStateに変換する必要があります。

このため、インストール状態ファイルをデシリアライズできますか?

Screenshot of the Installstate file

+1

ファイルはどのように見えますか?コードは書いてありますか? –

+0

このファイルの外観はわかりません。それがxmlまたはjsonなら、それは可能です。 C#でxmlとjsonをデシリアライズする例がいくつかあります。 –

+0

これはXMLファイルですが、逆シリアル化できません。 ファイルの先頭が <?xml version = "1.0" encoding = "utf-8"?> 0.72<バージョンz:Id = "3" z:タイプ= "System.Int32" z:アセンブリ= "0" xmlns = ""> 2 Sandy

答えて

1

あなたが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に割り当てます。

+0

AssemblyInstallerアンインストールメソッドはnullを渡すことができないIDictionary savedStateをとります。 – Sandy

+0

@Sandy - 誰が言ってるの?私が見ているバージョンは、 'null'として渡された場合、' ArgumentNullException'を送出しません。そして、私が言うように、それは常に 'INSTALLSTATE'ファイルをデシリアライズしたり、*ヌルに設定したりして、与えられた値を常に上書きします。 –

+0

上記のコードで、私はInstallStateファイルを逆シリアル化することができました。 しかし、これをAssemblyInstallerのUninstallメソッドに渡すと、オブジェクトのrefereceがインスタンス例外に設定されていません。 私はこの状態をインストーラクラスを持つDllに渡すかのように "savedState辞書には一貫性のないデータが含まれており、破損している可能性があります。" ただし、コントロールパネルからMSIを正しくアンインストールすることができます。 – Sandy

関連する問題