これは、私のclickonceアプリケーションのデプロイされたフォルダーの場所を取得するために機能し、検索で見たどこにも記載されていないことがわかったものです。
- Clickonceアプリケーションは、会社のLANネットワークフォルダーにデプロイされます。
- Clickonceアプリケーションは、オンラインまたはオフラインで使用できるように設定されています。
- プロジェクトプロパティのクリックワンスインストールURLと更新URLには何も指定されていません。つまり、インストールまたは更新のための個別の場所はありません。
- 私の公開オプションでは、clickonceアプリケーション用に作成されたデスクトップショートカットを使用しています。
- 起動時にパスを取得したいフォルダーは、パスをハードコーディングせずに、アプリケーションのDEV、INT、およびPRODバージョンからアクセスしたいフォルダーです。
これが私のユースケースのビジュアルです:
- 青いボックスで囲まれたフォルダは、各環境のアプリケーションのディレクトリの場所です。
- 赤いボックスで囲まれたフォルダーは、パスを取得するディレクトリです(これには、最初にアプリのデプロイされたフォルダーの場所「MyClickOnceGreatApp_1_0_0_37」を取得する必要があります。これはOPと同じです)。
この質問のどの提案も、クリックワンスアプリケーションが展開されたフォルダーを返すのに役立つコメントも見つかりませんでした(目的のフォルダーを見つけるために、このフォルダーに相対的に移動します)。他のインターネット検索や関連するSOの質問も答えを出しませんでした。
提案されたプロパティはすべて、オブジェクト(ActivationUriなど)がnullであるために失敗しているか、ローカルPCのキャッシュされたインストール済みアプリフォルダーを指しています。はい、IsNetworkDeployedのチェックによってnullオブジェクトを正常に処理できました。これは問題ではありませんが、実際には、Clickonceアプリケーションのネットワーク展開フォルダーの場所があるにもかかわらず、IsNetworkDeployedがfalseを返します。これは、アプリケーションがローカルのキャッシュされたビットから実行されているためです。
解決策は次のことです。
AppDomain.CurrentDomain.BaseDirectory
開発中にアプリケーションがビジュアルスタジオ内で実行されているとき
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
正常に実行されているとき。
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
すべてのケースで、私のclickonceアプリケーションがデプロイされているネットワークディレクトリを正しく返します。つまり、次の方法で起動されます。
- setup.exe
- MyClickOnceGreatApp.application
- アプリケーションの最初のインストールおよび起動時に作成されるデスクトップショートカット。
これは、WorkAccountsフォルダーのパスを取得するためにアプリケーションの起動時に使用するコードです。デプロイされたアプリケーションフォルダーの取得は、親ディレクトリに移動しないだけで簡単です。
string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
try
{
string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
path = path.Replace("file:", "");
path = path.Replace("/", "\\");
directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
}
catch (Exception ex)
{
directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
}
}