VisualStudio2005でインストーラを作成したアプリケーションの、アンインストール時の環境変数pathの扱い
- 初めまして。
タイトルに有ります通り、VisualStudio2005であるアプリケーションのインストーラを作成しています。
使用OSはWindows2000のSP4です。
このインストーラは、インストール時に起動条件のレジストリ検索で取得した環境変数pathに自らの[TARGETDIR]~binのパスを加えることで、環境変数pathに追加を行います。
ところが、アンインストール時には環境変数pathから自らのパスのみを削除させたいのですが、このやり方が分かりません。
現状では、アプリケーションをアンインストールすると環境変数pathごと消し去ってしまいます。
詳しい方、どうかご教授願います。
回答
Installerクラスを使って環境変数を編集するという手があります。
Installerクラスを使ってカスタム動作を設定すれば、インストール時またはアンインストール時に細かい制御が可能になります。http://dobon.net/vb/dotnet/deployment/customaction.html
http://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.aspx- 回答としてマークブラワヨ 2009年11月9日 2:14
これは、新しく小さなプログラムを作って、その中でアンインストール時点でのpathの値からインストール時の自パス"[TARGETDIR]~\bin"を除去させるような設定をし、そうして出来たプログラムをアンインスール時に実行するようカスタム動作で設定する、という事でよろしいでしょうか。
そうです。
ちなみにプログラムは「クラスライブラリ」で構いませんので、
これを Setup プロジェクトと同じソリューションに含め、
「プロジェクト」→「新しい項目の追加」→「インストーラクラス」と選択。今回のケースなら System.Configuration.Install.Installer を継承したクラスを定義し、以下のような感じで実装、ビルドしたのち、
Setup プロジェクトの「カスタム動作」→「アンインストール」に出来上がったクラスライブラリを指定すれば OK です。
ちなみに C# で実装しましたが、VB でも同じ話になります。using System; using System.Collections; using System.ComponentModel; using System.Configuration.Install; namespace CustomInstaller { /// <summary>
/// カスタムインストーラクラス
/// </summary> [RunInstaller(true)] public partial class ExInstaller : System.Configuration.Install.Installer { /// <summary>
/// アンインストール処理
/// </summary>
public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); // 環境変数「path」を編集しますよ } } }- 回答としてマークブラワヨ 2009年11月9日 2:14
環境変数を操作するなら、Environment クラスを使った方が早いです。メソッドが用意されてます。
http://msdn.microsoft.com/ja-jp/library/system.environment_members(VS.80).aspxあとはスペルミスや namespace の使い方の誤りだけですね。
これは単純ミスですので、自分でお調べください。- 回答としてマークブラワヨ 2009年11月9日 2:14
すべての返信
Installerクラスを使って環境変数を編集するという手があります。
Installerクラスを使ってカスタム動作を設定すれば、インストール時またはアンインストール時に細かい制御が可能になります。http://dobon.net/vb/dotnet/deployment/customaction.html
http://msdn.microsoft.com/ja-jp/library/system.configuration.install.installer.aspx- 回答としてマークブラワヨ 2009年11月9日 2:14
- ご回答ありがとうございます。
自分で調べていた時は「Installerクラスの使用」は全く想定出来ておりませんでした。
私はまだまだコンピュータの経験が未熟で、c++やVBが全く分からず、C言語やJavaをかじったのみで、今回は、とにかくVisualStudio2005の操作で出来る範囲で済ませようとしてしまっていました。
もう一点質問させて下さい。
これは、新しく小さなプログラムを作って、その中でアンインストール時点でのpathの値からインストール時の自パス"[TARGETDIR]~\bin"を除去させるような設定をし、そうして出来たプログラムをアンインスール時に実行するようカスタム動作で設定する、という事でよろしいでしょうか。 これは、新しく小さなプログラムを作って、その中でアンインストール時点でのpathの値からインストール時の自パス"[TARGETDIR]~\bin"を除去させるような設定をし、そうして出来たプログラムをアンインスール時に実行するようカスタム動作で設定する、という事でよろしいでしょうか。
そうです。
ちなみにプログラムは「クラスライブラリ」で構いませんので、
これを Setup プロジェクトと同じソリューションに含め、
「プロジェクト」→「新しい項目の追加」→「インストーラクラス」と選択。今回のケースなら System.Configuration.Install.Installer を継承したクラスを定義し、以下のような感じで実装、ビルドしたのち、
Setup プロジェクトの「カスタム動作」→「アンインストール」に出来上がったクラスライブラリを指定すれば OK です。
ちなみに C# で実装しましたが、VB でも同じ話になります。using System; using System.Collections; using System.ComponentModel; using System.Configuration.Install; namespace CustomInstaller { /// <summary>
/// カスタムインストーラクラス
/// </summary> [RunInstaller(true)] public partial class ExInstaller : System.Configuration.Install.Installer { /// <summary>
/// アンインストール処理
/// </summary>
public override void Uninstall(IDictionary savedState) { base.Uninstall(savedState); // 環境変数「path」を編集しますよ } } }- 回答としてマークブラワヨ 2009年11月9日 2:14
本来自分が調べなくてはならない所を、これほどまで詳しく解説して頂いて、本当にありがとうございます。
新たにget_env_pathという名前の(そのまんまですが・・・)プロジェクトを作成し、それをセットアッププロジェクトに追加、
その上でget_env_pathにインストーラクラスを作成し、以下の様なソースを書きました。
前半部分は、ほぼ、ひらぽん様の丸写しです。
アンインストール時の環境変数pathを改めてカスタム動作で取得することも考えましたがそれは行わず、
素直にフルパスから取得し、自パスをReplace()で除去した上で元に戻す、という動きを想定しています。
using System;
using System.String;
using System.Collections;
using System.ComponentModel;
using System.Configuration.Install;
namespace get_env_path
{
/// <summary>
/// カスタムインストーラクラス
/// </summary>
[RunInstaller(true)]
public partial class ExInstaller :
System.Configuration.Install.Istaller
{
/// <summary>
/// アンインストール処理
/// </summary>
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);// 環境変数environmentを展開
RegistryKey regkey =
Registry.LocalMachine.OpenSubKey(@"System\CurrentControlSet\Control\Session Manager\Environment", false);
if (regkey == null) return;// 環境変数のpathの値を格納
string location = (string)regkey.GetValue("path");// 自パスを除去
location = location.Replace("[TARGETDIR]\bin", "");// 環境変数environmentのpathに改めてセット
regkey.SetValue("path", location);// クローズ
regkey.Close();
}
}
}
しかしながら、
エラー 1 using namespace ディレクティブは名前空間に対してのみ使用できます。'System.String' は名前空間ではなく型です。 C:\Documents and Settings\miyachi\My Documents\Visual Studio 2005\Projects\get_env_path\get_env_path\Installer1.cs 2 7 get_env_path
エラー 2 型または名前空間名 'Istaller' は名前空間 'System.Configuration.Install' に存在しません。アセンブリ参照が不足しています。 C:\Documents and Settings\miyachi\My Documents\Visual Studio 2005\Projects\get_env_path\get_env_path\Installer1.cs 15 38 get_env_path
というエラーが発生いたしました。
お時間がよろしければこの点に関してもご教授下さい。環境変数を操作するなら、Environment クラスを使った方が早いです。メソッドが用意されてます。
http://msdn.microsoft.com/ja-jp/library/system.environment_members(VS.80).aspxあとはスペルミスや namespace の使い方の誤りだけですね。
これは単純ミスですので、自分でお調べください。- 回答としてマークブラワヨ 2009年11月9日 2:14
すでに参考になった。。。でマークつけちゃってるから見てないかな?
一応。。。WindowsInstaller(VSセットアッププロジェクトも同様ですが、出来ることを超えた範囲のため操作できない)で、環境変数を設定する場合は、Environment Table というテーブルに設定情報を記述します。
VSセットアップでは出来ないので、参考情報ということで。
わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/


