2010-02-18 28 views
9

Tôi đã tìm hiểu về Google để tìm cách xác định đường dẫn cài đặt do người dùng chọn từ trình hướng dẫn cài đặt.Dự án Cài đặt Visual Studio: Nhận Thư mục Mục tiêu

Về cơ bản tôi đang gặp phải sự cố dịch vụ của tôi không thể tạo tệp trong thư mục riêng vì dịch vụ này thiếu quyền thích hợp. Tôi giả định cách chính xác để giải quyết điều này là để đảm bảo rằng bất kỳ tài khoản dịch vụ đang sử dụng được cấp quyền truy cập tệp phù hợp trên thư mục của nó.

Nhưng trước khi tôi thậm chí có thể giải quyết cách đặt quyền thông qua. Net Tôi cần biết thư mục cài đặt. Tôi đang sử dụng một dự án cài đặt trong đó có một lớp cài đặt có chứa một điều khiển ServiceInstaller là tốt. Cả hai đều có thuộc tính Context vì vậy tôi đã kiểm tra xem các tham số có sẵn khi sự kiện AfterInstall kích hoạt cho mỗi trình cài đặt tương ứng. Tôi nghĩ lúc đầu tôi sẽ nhìn thấy bộ tài sản TargetDir nhưng đó không phải là trường hợp. Tuy nhiên, tôi thấy số AssemblyPath được đặt và trỏ đến tệp thực thi của thư mục thích hợp.

Về cơ bản tôi chỉ muốn chắc chắn rằng đây là phương pháp thích hợp tôi nên sử dụng:

private void ProjectInstaller_AfterInstall(object sender, InstallEventArgs e) 
{ 
    string InstallPath = System.IO.Path.GetDirectoryName(serviceInstaller1.Context.Parameters["AssemblyPath"]);; 
} 

Trả lời

12

tôi thấy rằng các giải pháp mà Berg cho công trình đối với tôi, ngoại trừ sử dụng giá trị này cho các tài sản CustomActionData:

/TargetDir="[TARGETDIR]\" 

Lưu ý thêm dấu gạch chéo ngược. Xem này article on MSDN.

+1

Bạn cũng phải thêm một khoảng trắng sau dấu "\". Nếu không, bạn có thể nhận được ngoại lệ FileNotFoundException khi cài đặt hoặc gỡ cài đặt. Xem [tại đây] (http://stackoverflow.com/questions/4516256/how-do-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825) hoặc [tại đây ] (http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008). –

+0

Bạn đang sử dụng đoạn văn bản này ở đâu? Lời giải thích của bạn không hoàn toàn rõ ràng với tôi, xin lỗi. Như một đối số dòng lệnh cho dự án? Một nơi nào đó trong mã? Liên kết đến MSDN cũng bị hỏng. Cảm ơn Microsoft! :-) –

+0

Ồ, tôi hiểu rồi. Tôi tìm thấy câu trả lời trong một bài đăng khác: "Trong dự án triển khai của bạn, hãy thêm Hành động tùy chỉnh cho Cài đặt và Cam kết. Đối với thuộc tính CustomActionData cho hành động tùy chỉnh Cài đặt, hãy nhập/Targetdir =" [TARGETDIR] \ "" –

3

hành động tùy chỉnh của bạn là một hành động tùy chỉnh chậm và chỉ có tính chất nhất định là có sẵn cho nó, xem trang sau để biết thêm chi tiết, http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx. Bạn có thể thêm thuộc tính TARGETDIR vào CustomActionData trong Visual Studio 2008; tuy nhiên, tôi đã không làm việc với Visual Studio 2008 như một công cụ authoring.

Thực hiện cài đặt phức tạp trong Visual Studio 2008 rất khó vì nó tóm tắt một số tính năng chính của MSI. Tôi thực sự khuyên bạn nên xem xét WiX.

Ngay cả khi bạn không sử dụng WiX, bạn sẽ muốn tải xuống Orca, http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx và sử dụng nó để xác thực cài đặt của bạn. Điều này sẽ giúp bạn tiết kiệm vô số giờ sau đó.

+0

WiX có khả năng cài đặt Dịch vụ Windows không? –

+0

Có WiX có khả năng cài đặt dịch vụ. Bạn chỉ cần tác giả phần tử ServiceInstall, http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm. Dự án thiết lập WiX và Visual Studio 2008 đều vừa là giao diện người dùng cho MSI. Nếu bạn quyết định đi với WiX, tôi khuyên bạn nên đọc, http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx và tất cả các mục con của nó. Nó sẽ giúp bạn hiểu các thành phần và tính năng. Ban đầu tôi bắt đầu sử dụng Visual Studio 2003 \ 2005 cho các lượt cài đặt của chúng tôi và chỉ gặp phải quá nhiều hạn chế. – LanceSc

+0

Tôi đã phải gắn bó với một dự án cài đặt Visual Studio cho dự án này nhưng 1 cho tôi một lựa chọn khả thi để nghiên cứu trong tương lai. :) –

0

Để thay thế cho các dự án thiết lập, bạn có thể sử dụng một số dịch vụ xây dựng trình cài đặt. Tôi nghĩ rằng, với http://installer.codeeffects.com bạn có thể tải bất kỳ tệp nào từ trang web của mình và đặt chúng trong thư mục cài đặt khi người dùng cài đặt dịch vụ của bạn. Hi vọng điêu nay co ich.

-1

Theo như tôi có thể nói đây là cách duy nhất để xác định thư mục cài đặt. Tất nhiên tôi sẽ lưu ý nếu ai đó đến cùng với một câu trả lời khác nhau nhưng cho đến lúc đó đây là cách tiếp cận tôi đang dùng.

+1

Đây không phải là câu trả lời. Cho dù bạn sử dụng giải pháp nào là câu trả lời. –

0

Để có được giá trị tài sản thư mục đích trong hành động tùy chỉnh của bạn, bạn có thể chuyển tiếp nó bằng tay bằng cách chọn đầu ra hành động tùy chỉnh của bạn trong giao diện hành động tùy chỉnh và đưa cái gì đó như:

/TargetDir="[TARGETDIR]" 

làm giá trị cho thuộc tính CustomActionData .

Sau đó, bạn sẽ có thể truy cập nó bằng:

string targetDir = Context.Parameters[ "TargetDir" ]; 
+0

Như tôi đã nói trong câu hỏi của mình, tôi đã kiểm tra giá trị đó nhưng tiếc là nó không được đặt vào thời điểm sự kiện xảy ra. –

1

Đối với những người có nhiều sẽ phải làm như thế này

/AppID="[APPID]" /Path="[TARGETDIR]\" 
2

Trong quá trình cài đặt, sự kiện tôi đã làm điều này:

// locate the installation directory and store it where we can find it during Commit 
stateSaver.Add("TargetDir", Context.Parameters["DP_TargetDir"]); 

sau đó, tôi đã có thể truy cập vào TargetDir sau trong OnCommitted:

string path = (string)savedState["TargetDir"]; 

Không chắc liệu điều đó có hữu ích hay không! Tôi đang cố gắng tìm ra cách xác định đáng tin cậy thư mục cài đặt để dịch vụ của tôi có thể thực hiện một số thao tác ghi nhật ký.

Các vấn đề liên quan