Đây là những gì tôi thấy rằng đã hoạt động để có thể có được vị trí thư mục đã triển khai của ứng dụng clickonce của tôi và điều đó đã không được đề cập ở bất cứ đâu tôi thấy trong các tìm kiếm của mình, cho kịch bản tương tự, cụ thể của tôi:
- Ứng dụng clickonce được triển khai vào thư mục mạng LAN của công ty.
- Ứng dụng clickonce được đặt thành trực tuyến hoặc ngoại tuyến.
- URL cài đặt clickonce và URL cập nhật trong thuộc tính dự án của tôi không có gì được chỉ định. Đó là, không có vị trí riêng để cài đặt hoặc cập nhật.
- Trong các tùy chọn xuất bản của mình, tôi có một lối tắt trên màn hình được tạo cho ứng dụng clickonce.
- Thư mục tôi muốn nhận đường dẫn khi khởi động là thư mục mà tôi muốn được truy cập bởi các phiên bản DEV, INT và PROD của ứng dụng mà không cần mã hóa đường dẫn.
Dưới đây là hình ảnh về trường hợp sử dụng của tôi:
- Các thư mục được đóng hộp màu xanh là vị trí thư mục của tôi cho từng ứng dụng của môi trường.
- Thư mục được đóng hộp màu đỏ là thư mục tôi muốn nhận đường dẫn (trước tiên yêu cầu vị trí thư mục được triển khai của ứng dụng "MyClickOnceGreatApp_1_0_0_37" giống với OP).
Tôi không tìm thấy bất kỳ đề xuất nào trong câu hỏi này hoặc nhận xét của họ để trả về thư mục mà ứng dụng clickonce đã được triển khai (sau đó tôi sẽ chuyển liên quan đến thư mục này để tìm thư mục quan tâm). Không có câu hỏi tìm kiếm trên internet hoặc các câu hỏi SO liên quan nào cũng đưa ra câu trả lời.
Tất cả các thuộc tính được đề xuất đều bị lỗi do đối tượng (ví dụ ActivationUri) là null hoặc đang trỏ đến thư mục ứng dụng được cài đặt trong bộ nhớ cache của PC cục bộ. Có, tôi có thể xử lý các đối tượng null một cách duyên dáng bằng cách kiểm tra IsNetworkDeployed - đó không phải là vấn đề - nhưng đáng ngạc nhiên là IsNetworkDeployed trả về sai mặc dù trên thực tế tôi có một vị trí thư mục được triển khai mạng cho ứng dụng clickonce. Điều này là do ứng dụng đang chạy từ các bit cục bộ, được lưu trong bộ nhớ cache.
Giải pháp là xem xét:
AppDomain.CurrentDomain.BaseDirectory
khi ứng dụng đang được chạy trong studio hình ảnh khi tôi phát triển và
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
khi nó đang thực thi bình thường.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
trả về chính xác thư mục mạng mà ứng dụng clickonce của tôi được triển khai, trong mọi trường hợp. Đó là, khi nó được khởi chạy thông qua:
- setup.exe
- MyClickOnceGreatApp.application
- Phím tắt trên máy tính để bàn được tạo khi cài đặt và khởi chạy ứng dụng đầu tiên.
Đây là mã tôi sử dụng khi khởi động ứng dụng để lấy đường dẫn của thư mục WorkAccounts. Bắt thư mục ứng dụng đã triển khai rất đơn giản chỉ bằng cách không di chuyển đến thư mục mẹ:
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();
}
}