簡體   English   中英

為什么在添加本地引用時,GAC的ASP.NET網站引用程序集?

[英]Why does ASP.NET web site reference assembly from GAC, when adding local reference?

當您使用ASP.NET網站(而不是Web應用程序模型)並從本地文件夾添加對程序集的引用時,Visual Studio似乎明白此本地程序集也在GAC中,因此不會將此程序集復制到bin文件夾(與非GAC程序集一樣),但只是在web.config文件中添加新記錄。

為什么這樣的行為呢? 是否可以強制復制到bin文件夾(我需要這個,因為.dll不在目標環境中)? 我可以將程序集添加到bin文件夾作為文件,它將工作,但在這種情況下bin文件夾內容將在源代碼控制,這是不好的。

您可以在引用上將“復制本地”屬性設置為“True”。 這應該將它添加到bin文件夾 - 在Web應用程序項目上。

但是對於Web站點項目,當您添加引用時,它所做的就是在引用程序集的web.config中添加一行。 它將首先在bin文件夾中查找此文件,然后在GAC中找不到該文件。

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

你說在源代碼管理中包含bin文件夾內容並不好。 對於您構建的二進制文件,通常認為這是正確的,但在您的情況下,您擁有的二進制資產不會作為項目的一部分進行編譯。 從哲學上講,這些等同於圖像:二進制資產不是作為項目的一部分編譯的。 我認為它們屬於源代碼控制,就像你的項目依賴的任何其他二進制文件一樣。 但這是個人選擇。

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

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

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

CopyLocal的項目分配值按以下順序確定:

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

希望這可以幫助

小號

有關如何為Web項目(而非Web應用程序)設置“引用的復制本地屬性”的信息,請參閱:

http://msdn.microsoft.com/en-us/library/t1zz5y8c(v=VS.100).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM