2010-01-07 31 views
12

當您使用ASP.NET網站(而不是Web應用程序模型)並從本地文件夾Visual Studio中添加對程序集的引用時,似乎知道此本地程序集也位於GAC中,因此不會將此程序集複製到bin文件夾(與非GAC程序集一樣),但只是在web.config文件中添加新記錄。爲什麼添加本地引用時,來自GAC的ASP.NET網站引用程序集?

爲什麼這樣的行爲?是否有可能強制複製到bin文件夾(我需要這個,因爲.dll不在目標環境中)?我可以將程序集作爲文件添加到bin文件夾中,並且它可以工作,但在這種情況下,bin文件夾內容將位於源代碼管理中,這並不好。

回答

12

您可以在引用上將Copy Local屬性設置爲True。這應該將其添加到bin文件夾 - 在Web應用程序項目上。

但是,對於Web站點項目,添加引用時,所做的只是將一行添加到引用程序集的web.config。它將首先在bin文件夾中查找此文件,然後在GAC中找到它(如果未找到)。

有兩種選擇:要求將程序集安裝到目標機器上的GAC(在這種情況下,XCOPY部署是不可能的),或者將所有必需的程序集包含在bin文件夾中,方法是將其複製或寫入這是一個後期構建腳本。您可以使用命令提示符並轉到c:\ windows \ assembly \ GAC中找到.dll,找到您感興趣的程序集,cd進入該目錄,然後用您感興趣的版本cd進入目錄。將爲您提供在構建後腳本中使用的路徑。例如,對於GAC中的輔助功能部件,您最終將獲得以下路徑: c:\ Windows \ assembly \ GAC \ Accessibility \ 1.0.5000.0__b03f5f7f11d50a3a \ Accessibility.dll

您說包括bin文件夾源代碼管理中的內容不好。這通常被認爲是你構建的二進制文件的真實情況,但在你的情況下,你有沒有被編譯爲項目一部分的二進制資產。在哲學上,這些相當於圖像:二進制資產沒有被編譯爲項目的一部分。我認爲他們屬於源代碼管理,就像你的項目所依賴的任何其他二進制文件一樣。但這是個人選擇。

+0

如何設置此屬性?當我打開網站的「屬性頁面」時,會看到引用列表,但「複製本地」在此處不可用。請注意,這是網站(不是網絡應用程序) – Konstantin 2010-01-07 23:32:54

+0

它是引用的屬性,而不是網站。但我現在看到爲什麼你指定它是一個網站而不是一個Web應用程序。我會編輯我的答案。 – Don 2010-01-08 18:00:18

+0

我已將此答案標記爲已接受,謝謝。然而,我仍然不明白VS的邏輯 - 如果我添加本地程序集 - 爲什麼要在GAC中搜索它,然後從GAC中引用它? – Konstantin 2010-01-11 07:25:36

4

在運行時,程序集必須位於以下兩個位置之一:項目的輸出路徑或全局程序集緩存(請參閱使用程序集和全局程序集緩存)。如果項目包含對不在這些位置之一中的對象的引用,則在構建項目時,必須將引用複製到項目的輸出路徑。 CopyLocal屬性指示是否需要創建此副本。如果該值爲真,則複製參考。如果爲false,則不會複製該參考。

CopyLocal的項目分配的值是按照下面的順序來確定:

  1. 如果引用另一個項目中,被稱爲項目到項目引用,則該值是真實的。
  2. 如果在全局程序集緩存中找到該程序集,則該值爲false。
  3. 作爲一種特殊情況,mscorlib.dll引用的值爲false。
  4. 如果在Framework SDK文件夾中找到該程序集,則該值爲false。 否則,該值爲true。

希望這有助於

小號

6

如果您在Visual Studio中使用網站項目,並且引用始終將其指向GAC版本而不是某個其他文件夾(例如lib),則需要創建一個xxxx.dll.refresh文件在您的/ bin文件夾中,其中xxxx是您引用的有問題的dll。

這也解決了MSBuild的構建問題,即服務器期望dll位於GAC中。 .refresh文件將從正確的相對路徑獲取文件以正確構建。

相關問題