İşte benim clickonce uygulamamın konuşlandırılmış klasör konumunu elde etmek için çalıştı ve benzer, özel senaryom için aramalarımda gördüğüm herhangi bir yerde belirtilmeyen şeyleri buldum:
- Clickonce uygulaması bir şirket LAN ağı klasörüne dağıtılır.
- Clickonce uygulaması çevrimiçi veya çevrimdışı kullanılabilir olacak şekilde ayarlanmıştır.
- Proje mülklerimdeki clickonce kurulum URL'm ve Güncelleme URL'lerimde hiçbir şey belirtilmedi. Yani, kurulum veya güncellemeler için ayrı bir konum yoktur.
- Yayınlama seçeneklerimde, clickonce uygulaması için bir masaüstü kısayolu oluşturuyorum.
- Başlangıçta yol almak istediğim klasör, uygulamanın kodunu yazmadan uygulamanın DEV, INT ve PROD sürümleri tarafından erişilmesini istediğim klasör.
İşte benim kullanım durumumun bir görsel:
- Mavi kutulu klasörler, her ortamın uygulaması için dizin yerlerimdir.
- Kırmızı kutulu klasör, yolunu almak istediğim dizindir (uygulamanın ilk olarak OP ile aynı olan konuşlandırılmış klasör konumu "MyClickOnceGreatApp_1_0_0_37" almayı gerektirir).
Clickonce uygulamasının dağıtıldığı klasörü döndürmek için bu sorudaki önerilerini veya yorumlarını bulamadım (daha sonra ilgilendiğim klasörü bulmak için bu klasöre göre hareket edeceğim). Başka hiçbir internet araması ya da ilgili SO sorusu da cevap vermedi.
Önerilen özelliklerin tümü, nesnenin (örn. ActivationUri) boş olması nedeniyle başarısız olmuş veya yerel bilgisayarın önbelleğe alınmış yüklü uygulama klasörünü işaret ediyordu. Evet, null nesnelerini zarif bir şekilde IsNetworkDeployed için bir çekle işleyebilirim - bu bir sorun değil - ama şaşırtıcı bir şekilde IsNetworkDeployed, aslında clickonce uygulaması için ağa dağıtılmış bir klasör konumuna sahip olmamasına rağmen yanlış döndürür. Bunun nedeni, uygulamanın yerel, önbelleğe alınmış bitlerden çalıştırılmasıdır.
Çözüm şunlara bakmaktır:
AppDomain.CurrentDomain.BaseDirectory
uygulama görsel stüdyo içerisinde geliştirilirken,
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
normal yürütülürken.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
clickonce uygulamamın dağıtıldığı ağ dizinini her durumda doğru şekilde döndürür. Yani, üzerinden başlatıldığında:
- setup.exe
- MyClickOnceGreatApp.application
- Uygulamanın ilk yüklenmesi ve başlatılmasıyla oluşturulan masaüstü kısayolu.
İşte WorkAccounts klasörünün yolunu almak için uygulama başlangıcında kullandığım kod. Konuşlanan uygulama klasörünü almak, yalnızca üst dizinlere gitmeyerek basittir:
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();
}
}