我一直在觀察ReSharper創建的解決方案的體系結構視圖,當我注意到一些項目引用沒有編譯時間用法,這是否意味着我可以更改程序集在運行時?引用沒有編譯時使用
0
A
回答
1
簡而言之,編譯時使用意味着即使刪除引用,代碼也會編譯。您無法直接從此聲明中獲取有關運行時的任何信息。如果你只是刪除這個引用,它甚至可能是你的應用程序運行得很好。也可能是你的引用有些混亂,編譯器不知道它。這可能是因爲引用是實現您編譯的接口,或者您正在運行時手動查找它(請參閱Florians答案)。如果你真的想,你也可以用反射來隱藏它。但是這也需要在運行時手動加載程序集。
在編譯時,編譯器會將新的二進制文件鏈接到引用程序集中的相應代碼。這將允許在運行時自動加載程序集。它也會將常量值複製到你的程序集中。
雖然你應該非常小心,但你可以在編譯和運行之間更改引用的程序集。如果方法簽名更改,則編譯時引用將中斷。
在運行時,引用程序集將在您嘗試與它們交互時加載。裝配完成後,它不能直接卸載。您只能卸載AppDomains。因此,如果您想在運行時更改程序集,請查看AppDomains。
那麼,那些非編譯時引用的用意是什麼呢? Florian在其他答案中提到了使用這種最常見的體系結構:插件。還有其他依賴關係,您希望通過接口將代碼與實際實現分開。然後,您的項目引用無編譯時依賴關係,僅用於將實現交付給實際應用程序。否則,您需要將其添加到您的交付和調試過程中,這可能會很痛苦,具體取決於您的項目。
相關問題
- 1. 沒有引用pthread_mutex_lock與-lpthread編譯
- 2. 添加引用時沒有編譯錯誤,但在編譯時發現錯誤
- 3. Postgres在索引編譯期間沒有使用足夠的CPU!
- 4. 編譯沒有ros的roscpp(使用g ++)
- 5. Sass沒有使用patternlab節點編譯
- 6. 沒有在編譯時
- 7. 編譯時沒有庫[LWJGL]
- 8. 編譯沒有Silverlight項目引用的Web應用程序
- 9. GWT編譯bean引用(沒有源代碼可用於類型)
- 10. Eclipse CDT - 輸出 - 使用vs編譯器時沒有幫助
- 11. 編譯時使用libstdC++。so.5沒有找到符號@ GLIBCPP_3.2
- 12. 使用javax.tools進行編譯並且運行時沒有反射
- 13. 使用GCC編譯時間typeid而沒有RTTI
- 14. 使用Qt Creator編譯時,我的異常沒有被捕獲
- 15. 什麼時候StringBuffer/StringBuilder沒有被編譯器隱式使用?
- 16. 在android編譯proguard時引用錯誤?
- 17. 未定義的引用「_asan_init_v4」編譯時
- 18. 有沒有辦法在使用編譯的ASP.NET MVC視圖時減少編譯時間?
- 19. 沒有引用的類是否被編譯?
- 20. 未定義在使用g ++編譯時引用sem_wait和pthread_create
- 21. Android Databinding編譯警告:使用'。'的方法引用已過時
- 22. 嘗試使用cmake編譯代碼時未定義的引用
- 23. 如何在使用Mono編譯時引用Microsoft.Boogie?
- 24. 使用g ++編譯時引用類是不明確的4.5.2
- 25. 使用libvpx編譯項目時未定義的引用
- 26. 當使用maven引用一個庫時編譯錯誤
- 27. 引起:android.database.sqlite.SQLiteException:編譯時沒有這樣的表:SELECT FROM ..
- 28. 沒有使用gettext翻譯
- 29. 當庫沒有註冊時,無法使用引用的TLB編譯.NET應用程序
- 30. DbContext沒有編譯?
因此,我編譯我的解決方案中的項目。他們現在在我的工作目錄中。所以在我的解決方案中,我有兩個項目沒有編譯時間的用法,這是否意味着我可以單獨編譯其中一個項目(而不是整個解決方案),現在我有工作目錄(使用舊版本的項目1程序集)並新創建項目1的組裝。所以你說我可以用工作目錄中的舊工具更改新創建的程序集,通過與AppDomain一起玩,進程仍在運行(也許有些時間停工)? – kuskmen
這樣做的關鍵是儘可能減少停機時間,而無需啓動此過程的新實例,因爲例如我的解決方案可能需要大量時間來編譯/優化等。我不想通過該過程每次我對沒有編譯時間的項目進行更改時使用 – kuskmen
是的,如果您使用AppDomains,則應該能夠設置一些邏輯來實現此目的。看看例如https://www.brad-smith.info/blog/archives/500的一些想法 –