Visual Studio Installerプロジェクトのカスタムアクションを作成して、構成ファイルのアクセス許可を変更しようとしました。
Installer.csは次のとおりです。
public override void Commit(IDictionary savedState)
{
base.Commit(savedState);
// Get path of our installation (e.g. TARGETDIR)
//string configPath = System.IO.Path.GetDirectoryName(Context.Parameters["AssemblyPath"]) + @"\config.xml";
string configPath = @"C:\Program Files\Blueberry\Serial Number Reservation\config.xml";
// Get a FileSecurity object that represents the current security settings.
FileSecurity fSecurity = File.GetAccessControl(configPath);
//Get SID for 'Everyone' - WellKnownSidType works in non-english systems
SecurityIdentifier everyone = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
// Add the FileSystemAccessRule to the security settings.
fSecurity.AddAccessRule(new FileSystemAccessRule(everyone, FileSystemRights.Modify | FileSystemRights.Synchronize, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
// Set the new access settings.
File.SetAccessControl(configPath, fSecurity);
}
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
}
public override void Rollback(IDictionary savedState)
{
base.Rollback(savedState);
}
public override void Uninstall(IDictionary savedState)
{
base.Uninstall(savedState);
}
次に、セットアッププロジェクトのカスタムアクションのコミットセクションにプライマリ出力(Installerクラス= true)を追加します。
インストーラーを実行すると、次のエラーが表示されます。
Error 1001: Could not find file 'c:\mypath\myapp.InstallState'
Webの精練似たような経験の例をいくつか見つけましたが、提供されたソリューションはどれも私にとってはうまくいきませんでした。
何か案は?
引用するには:
問題は、MSIインフラストラクチャが、通常はインストールフェーズ中に作成されるインストール状態ファイルを探していることです。カスタムアクションがインストールフェーズに参加しない場合、ファイルは作成されません。
解決策は、カスタムアクションをインストールフェーズとコミットフェーズの両方に追加することですが、インストールフェーズでは何も行いません。
4つのオーバーライド(Install、Uninstall、Commit、Rollback)のすべてに対してインストーラプロジェクトでカスタムアクションを指定しなかったときに、この問題が発生しました。 4つすべてのカスタムアクションとしてプロジェクト出力を指定するとすぐに、問題は解消しました。
私のインストーラークラスで何もしない唯一のオーバーライドは、コミットとアンインストールでした。 InstallはもともとInstallStateファイルの作成を担当していたと思います。InstallStateファイルが呼び出されなかったため、InstallStateファイルは作成されませんでした。
時々、「Debugger.Launch();」これらの上書きされた関数にデバッグ用に配置されます。そこでステートメントを使用してインストーラーをビルドし、インストール中にデバッグが必要かどうかを尋ねるダイアログがポップアップします。「デバッグのキャンセル」を押すと、このエラーダイアログが表示されます。関数に「Debugger.Launch()」を追加したため、その関数はインストーラーによって「欠落」していると見なされます。だから、それを削除することを忘れないでください。
これは、インストーラークラスが正しく作成されていない場合に発生することがあります。これはあなたを助けるかもしれないチュートリアルです: http://devcity.net/Articles/339/1/article.aspx
カスタムアクションがチュートリアルの推奨事項に従っていることを確認してください。
コンソールアプリの例: "mypostinstallapp.exe"のように、ポストインストール実行可能ファイルを作成します。
"mypostinstallapp.exe"をmsi製品と共にインストールします。複数のインストールで使用する場合は、アプリケーションフォルダーまたは共有フォルダーと一緒に配置します。
カスタムアクション(msiプロジェクトを右クリックしてカスタムアクションを表示)で、[コミット]セクションにアクションを追加します。最後に向かって実行したい場合。
次に、アクションビューから「mypostinstallapp.exe」を選択し、そのプロパティでInstallerClass Falseを設定します。
"mypostinstallapp.exe"で実行するのは、cmdファイルを探してプロセスとして実行することです。
だから私はものをcmdファイルに追加し、カスタムアクションプロセスについて忘れることができます。
カスタムアクションのプロパティで、trueではなくInstaller class = falseを設定してみてください。これでこの問題は解決しました。
私にとっての問題は、CustomActionData文字列のテキストボックス名の1つを閉じる引用符を追加するだけの簡単なものでした。
ユーザーインターフェースセクションの「テキストボックス(A)」ウィンドウと「テキストボックス(B)」ウィンドウを使用していました。 Aには1つのボックスEDITA1
があり、ここでファイルへのパスを取得します。Bには、いくつかのデータベースパラメーター用に2つのボックスEDITB1
とEDITB2
があります。私のCustomActionData文字列は次のようになりました:
/filepath="[EDITA1]" /Host="[EDITB1] /port="[EDITB2]"
それはあったはずです:
/filepath="[EDITA1]" /Host="[EDITB1]" /port="[EDITB2]"
([EDITB1]
の終了の引用)
インストーラークラスのInstallオーバーライドを使用して値(つまりstring filepath = Context.Parameters["filepath"];
)を取得し、それをINIファイルに書き込んで、アプリがインストール後に使用できるようにします。カスタムアクションGUIのすべてのフェーズでの「プライマリ出力」ですが、InstallerClassプロパティ(デフォルト:True)では何もせず、CustomActionData文字列のみを設定します1つをインストールします。他のフェーズではカスタムなことは何もしていなかったため、Installerクラスにオーバーライド関数を含めていませんでした。
管理者コマンドプロンプトでこれをインストールしてみてください。これは私のために働きました。