[英]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的項目分配值按以下順序確定:
希望這可以幫助
小號
有關如何為Web項目(而非Web應用程序)設置“引用的復制本地屬性”的信息,請參閱:
http://msdn.microsoft.com/en-us/library/t1zz5y8c(v=VS.100).aspx
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.