Inilah yang saya temukan yang berfungsi untuk bisa mendapatkan lokasi folder yang digunakan dari aplikasi clickonce saya dan yang belum disebutkan di mana pun saya lihat dalam pencarian saya, untuk skenario yang mirip dan spesifik:
- Aplikasi clickonce digunakan untuk folder jaringan LAN perusahaan.
- Aplikasi clickonce diatur untuk tersedia secara online atau offline.
- URL instalasi clickonce saya dan Perbarui URL di properti proyek saya tidak ada yang ditentukan. Artinya, tidak ada lokasi terpisah untuk instalasi atau pembaruan.
- Dalam opsi penerbitan saya, saya memiliki pintasan desktop yang dibuat untuk aplikasi clickonce.
- Folder yang ingin saya dapatkan path saat startup adalah folder yang ingin saya akses oleh DEV, INT, dan versi PROD aplikasi, tanpa hardcoding path.
Berikut ini adalah visual dari use case saya:
- Folder kotak biru adalah lokasi direktori saya untuk aplikasi masing-masing lingkungan.
- Folder kotak merah adalah direktori yang saya ingin dapatkan jalurnya (yang mengharuskan lokasi folder yang digunakan aplikasi "MyClickOnceGreatApp_1_0_0_37" yang sama dengan OP).
Saya tidak menemukan saran dalam pertanyaan ini atau komentar mereka untuk mengembalikan folder tempat aplikasi clickonce digunakan (bahwa saya kemudian akan bergerak relatif ke folder ini untuk menemukan folder yang menarik). Tidak ada pencarian internet lain atau pertanyaan SO terkait yang menghasilkan jawaban.
Semua properti yang disarankan gagal karena objek (misalnya ActivationUri) menjadi nol, atau menunjuk ke folder aplikasi yang diinstal dalam cache PC lokal. Ya, saya dapat menangani objek null dengan anggun dengan memeriksa IsNetworkDeployed - itu bukan masalah - tetapi anehnya IsNetworkDeployed mengembalikan false walaupun saya sebenarnya memiliki lokasi folder yang dikerahkan jaringan untuk aplikasi clickonce. Ini karena aplikasi dijalankan dari bit cache lokal.
Solusinya adalah dengan melihat:
AppDomain.CurrentDomain.BaseDirectory
ketika aplikasi sedang dijalankan di dalam studio visual seperti yang saya kembangkan dan
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
ketika dijalankan secara normal.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
dengan benar mengembalikan direktori jaringan tempat aplikasi clickonce saya digunakan, dalam semua kasus. Yaitu, ketika diluncurkan melalui:
- setup.exe
- Aplikasi MyClickOnceGreatApp.
- Pintasan desktop dibuat saat pertama kali menginstal dan meluncurkan aplikasi.
Berikut kode yang saya gunakan saat startup aplikasi untuk mendapatkan path dari folder WorkAccounts. Mendapatkan folder aplikasi yang dikerahkan itu sederhana dengan tidak berbaris ke direktori induk:
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();
}
}