2010-02-18 80 views
9

我一直在挖掘Google試圖找到合適的方式來確定用戶從安裝嚮導中選擇的安裝路徑。Visual Studio安裝項目:獲取目標目錄

基本上我遇到了一個問題,我的服務無法在自己的目錄中創建文件,因爲它缺少適當的權限。我假設解決這個問題的正確方法是確保服務使用的任何帳戶在其文件夾上都有適當的文件權限。

但在我甚至可以解決如何通過.Net設置權限之前,我需要知道安裝文件夾。我正在使用一個安裝項目,它有一個安裝程序類,其中還包含一個ServiceInstaller控件。兩者都有Context屬性,因此我一直在檢查AfterInstall事件觸發每個相應安裝程序時可用的參數。我想起初我會看到TargetDir屬性集,但事實並非如此。但是,我看到AssemblyPath已設置並指向相應文件夾的可執行文件。

基本上我只是想確保,這是適當的方法,我應該使用:

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

回答

12

我發現,伯格給了我的作品,除了使用該值CustomActionData屬性的解決方案:

/TargetDir="[TARGETDIR]\" 

注意添加反斜槓。看到這個article on MSDN

+1

您還必須在反斜槓「\」後添加額外的空格。否則,在安裝或卸載時可能會遇到FileNotFoundException異常。見[這裏](http://stackoverflow.com/questions/4516256/how-do-i-fix-setup-project-with-custom-action-file-not-found-exception/4522825#4522825)或[這裏](http://stackoverflow.com/questions/8491095/error-1001-using-custom-installer-with-visual-studio-2008)。 – 2013-08-11 08:24:20

+0

你在哪裏使用這一點文字?你的解釋不是很清楚,對不起。作爲項目的命令行參數?代碼中的某處?現在MSDN的鏈接也被破壞了。感謝微軟! :-) – 2014-05-15 22:54:35

+0

哦,我明白了。我在另一篇文章中找到了答案: 「在您的部署項目中,添加一個用於安裝和提交的自定義操作。對於安裝自定義操作的CustomActionData屬性,輸入/ Targetdir =」[TARGETDIR] \「」 – 2014-05-15 22:56:33

3

您的自定義操作是一種遞延自定義操作,只有某些屬性提供給它,請參閱下頁欲瞭解更多詳情,請致電http://msdn.microsoft.com/en-us/library/aa370543(VS.85).aspx。您可以將TARGETDIR屬性添加到Visual Studio 2008中的CustomActionData中;不過,我還沒有使用Visual Studio 2008作爲創作工具。

在Visual Studio 2008中執行復雜的安裝非常困難,因爲它會將MSI的許多關鍵功能抽象出來。我強烈建議看看WiX。

即使您不使用WiX,您也會想要下載Orca,http://msdn.microsoft.com/en-us/library/aa370557(VS.85).aspx並使用它來驗證您的安裝。這將爲您節省無數小時。

+0

WiX能夠安裝Windows服務嗎? – 2010-02-19 01:37:38

+0

是的,WiX能夠安裝服務。您只需編寫ServiceInstall元素,即http://wix.sourceforge.net/manual-wix2/wix_xsd_serviceinstall.htm。 WiX和Visual Studio 2008安裝項目都只是MSI的前端。如果你決定使用WiX,我會建議閱讀,http://msdn.microsoft.com/en-us/library/aa370566(VS.85).aspx和它的所有子條目。它將幫助您瞭解組件和功能。我最初開始使用Visual Studio 2003 \ 2005進行安裝,並遇到太多限制。 – LanceSc 2010-02-19 04:01:12

+0

我必須堅持爲這個項目安裝一個Visual Studio安裝項目,但+1會給我一個可行的替代研究的未來。 :) – 2010-03-26 17:25:43

0

作爲安裝項目的替代方案,您可以使用一些安裝程序構建服務。我認爲,使用http://installer.codeeffects.com時,您可以從您的網站加載任何文件,並在用戶安裝服務時將其放入安裝目錄。希望這可以幫助。

-1

據我所知,這是確定安裝目錄的唯一方法。當然,如果有人遇到不同的答案,我會注意到,但在此之前這是我正在採取的方法。

+1

這不是一個答案。無論您使用哪種解決方案都是答案。 – 2013-03-27 17:12:34

0

爲了讓您的自定義操作的目標目錄的屬性值,你可以通過自定義操作視圖中選擇您的自定義操作的輸出,並把類似手動轉發:

/TargetDir="[TARGETDIR]" 

爲CustomActionData屬性值。

然後,您應該能夠通過訪問它:

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

正如我在我的問題中所說的那樣,我檢查了這個值,但不幸的是在事件發生時沒有設置。 – 2010-06-07 09:57:45

1

對於那些誰擁有多個必須做這樣的

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

在安裝過程中,事件中,我這樣做:

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

然後,我才能夠在OnCommitted後訪問TargetDir

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

不知道這是否有幫助!我試圖找出如何可靠地確定安裝目錄,以便我的服務可以做一些日誌記錄。