2011-04-30 16 views
3

我有一個引用ProjectA的服務。在項目A,我有一系列的XML文件,這些文件都內容生成操作複製到輸出方向複製的始終構建操作:內容 - 如何將它轉移到執行彙編文件夾而不是僅僅是項目文件夾?

當我按照預期進行編譯時,我可以進入ProjectA/bin/debug文件夾並查看XML文件。這很好,但是當我運行引用ProjectA的服務時,這些文件不包含在Service/bin/debug文件夾中(儘管ProjectA.dll在那裏)。

我期待XML文件也被複制到Service/bin/debug文件夾,因爲它們被標記爲內容。就像現在一樣,這個「內容」標誌看起來有點沒用,因爲執行的程序集似乎不能訪問那些不包含在「服務」項目中的文件(這是我想避免的,因爲我將有多個項目引用ProjectA)。

有關如何處理此問題的任何提示?

回答

1

如果您在包含命令行副本的服務項目上創建預構建事件,則您應該沒事。

+0

我是否還必須向所有參考ProjecA並需要這些文件的項目添加預構建事件?即,TestProject,GUIProject等?我希望有一種方法只需將其添加到ProjectA本身。 – bugfixr 2011-04-30 13:09:55

0

對於那種情況下,我要麼:

  • 使用常見的文件夾(如共同綱領文件或其他),並存儲在troughout解決方案共享的應用程序設置的位置。
  • 使用後構建操作將文件複製到手動指定的輸出目錄。

您也可以嵌入在裝配中的文件,並讓他們作爲資源...

問候

+0

如果Service項目的輸出文件夾不存在(即尚未構建),則無法保證在ProjectA上使用Post-Build。 – 2011-04-30 13:07:14

+0

感謝您的建議。將它們作爲嵌入式資源將是理想的,但是我無法控制哪一部分代碼將其視爲物理文件。 – bugfixr 2011-04-30 13:13:06

+0

@Chu - 將文件保存到兩個項目都知道的文件夾怎麼樣? – 2011-04-30 14:08:07

1

另一個潛在選擇是從項目A作爲服務的鏈接添加XML文件項目,然後將鏈接文件設置爲內​​容並始終複製。要添加文件作爲鏈接,請選擇「添加現有」選項,然後選擇要添加的文件,但不要單擊添加按鈕,而要使用下拉列表並選擇「添加爲鏈接」。這是一個選項,我很少使用,但它可能是在這種情況下非常有用...

enter image description here

1

,我想避免因爲我將有多個項目引用項目A

你」有一個更大的問題,服務也需要找到程序集。其中,如果您想在EXE項目之間共享它,則需要位於一個衆所周知的位置,除非您將該程序集複製到GAC,否則這些位置不會自動找到。您無法將.xml文件複製到GAC。

只要共享組件是你的目標,那麼你有兩個途徑:

  • 註冊程序集在GAC中,因此它可以被發現。放置.xml文件是一個衆所周知的位置,爲此創建了c:\ programdata文件夾。

  • 將程序集保留在任意位置,如c:\ program files \ projecta。您需要在每個EXE項目中實施AppDomain.AssemblyResolve事件以幫助CLR找到程序集。使.config文件中的文件夾路徑設置是明智的。同一個文件夾現在也是.xml文件的好地方。考慮將公共靜態屬性添加到返回文件夾路徑的DLL。您可以使用Assembly.GetExecutingAssembly()。位置。當你選擇這種方法時,要小心DLLHell的相當大的危險,爲一個解決方案更新DLL可能會破壞所有使用projecta的DLL。

0

在你的web.config中試試這個。

<hostingEnvironment shadowCopyBinAssemblies="false" /> 

它強制直接從bin文件夾(您的內容所在的位置)讀取dll。

雖然需要重新啓動網絡服務器,但由於dll被鎖定,但易於解決,因此會產生副作用。

0

不記得我在哪裏找到這個,但嘗試以下。在部署時注意VS 2010中的「發佈」錯誤,因爲它不會將依賴項目內容複製到發佈輸出目錄。目前你必須手動複製,但我想我看到它已在VS2012中修復。

/// <summary> 
    /// Gets the current application directory. 
    /// For class libraries and executables returns the executing directoy. 
    /// For web applications returns the bin directory. This is important to find content relative to the assembly in the bin folder 
    /// versus the actual executing location which maybe the shallow copy folder (Microsoft Asp.Net temporary folder). 
    /// </summary> 
    /// <returns>path to the appication directory</returns> 
    public static string GetApplicationDirectory() 
    { 
     if (AppDomain.CurrentDomain.RelativeSearchPath != String.Empty && AppDomain.CurrentDomain.RelativeSearchPath != null) 
      return AppDomain.CurrentDomain.RelativeSearchPath; 
     else 
      //if null check normal way  
      return System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
    } 
相關問題