發現以前編譯完才100M?
非常感謝大家的答復,我也花了兩天時間研究這個東西。由于項目中共有477個項目,僅訪問Oracle數據庫的
Oracle.ManagedDataAccess.dll
,6.5M,復制100多份就有1G了。再加上系統自動生成的系統DLL,加起來超過2G了。所以問題必須解決,不然每次復制發布都是2G以上,先復制出來,再移除源代碼,再復制到發布服務器,這個過程經常需要花費3個小時。以前才100M,幾分鐘就好。現在說一下初步的解決方法(不是很完美):
1、我沒找到直接不生成系統文件的辦法。
2、由于我發布在Windows平臺上,可以考慮刪除一些系統自帶的DLL。于是我寫了一個小程序,用批處理調用這個小程序,遇到相關的系統文件就刪除。(包括移除源代碼,如
.cs
文件)代碼不全,幾十個系統文件都刪除。刪除完畢后,只剩下100M左右了,恢復以前的大小。在解決方案中設置Oracle.ManagedDataAccess.dll
為不復制。3、發布運行發現,運行不成功。顯然刪除的文件太多了。通過調試發現
netstandard.dll
、System.Net.Http.dll
、Oracle.ManagedDataAccess.dll
這三個文件不能缺少。于是修改刪除代碼,保留這三個文件。但是大小還是有1G多。顯然不能不刪除這三個文件。如果大家的項目不多,不會復制100多次這幾個文件,那么到此為止,就能解決問題了。但是我還沒有解決完畢。4、將這幾個文件放在外面一個Dependencies的文件夾中,讓程序知道這幾個DLL即可。為了解決這個問題,首先是嘗試在配置文件中修改。可惜,只能是子目錄下的文件才能這么干。因此只能重新想辦法。發現有一個AssemblyResolve方法,寫的代碼如下:
遇到這3個DLL找不到出錯就按指定的目錄去找。這樣只需要在SVC的構造函數和Page的Load方法中調用AddAssemblyResolve即可(雖然項目多,但都有繼承,實際上只需要在一兩個地方修改代碼即可)。至此,我的程序可以恢復只有100M,也可以正常運行。基本解決問題了。
5、可能有人注意到里面有“
resources.dll
”相關的代碼,這是因為在WinForm程序中,老是找不到圖片相關的資源文件,其實不影響,為此屏蔽這種情況觸發的AssemblyResolve事件。此次,該問題基本算是圓滿解決。但不是完美解決。我期待的完美解決是直接找到設置,能直接不生成那么多系統文件。盡管不完美,我還是先答復了,避免大家再費勁琢磨。如果有朋友找到直接不生成系統Dll的設置,煩請告知。畢竟第一次復制出來,運行批處理刪除文件時,復制還是有1G多,挺浪費時間,所以還是想解決。謝謝。