Microsoft .NET 框架 FAQMicrosoft Corporation 2001 年 7 月 摘要:本文包含有關 Microsoft .NET 和 Microsoft .NET 框架的常見問題。(共 15 頁打印頁) 內容概念性問題 運行庫技術問題 術語 程序集 應用程序部署和隔離 垃圾回收 遠程處理 互操作性 安全性 概念性問題
運行庫技術問題術語
程序集
應用程序部署和隔離
垃圾回收
遠程處理
互操作性
安全性
概念性問題什么是 .NET 框架?Microsoft .NET 框架是生成、部署和運行 Web 服務及應用程序的平臺。它提供了一個生產率高且基于標準的多語言環境,用于將現有投資與下一代應用程序和服務集成,同時提供了解決 Internet 規模應用程序的部署和操作難題的靈活性。.NET 框架由三個主要部分組成:公共語言運行庫、統一類庫的分層集合和稱為 ASP.NET 的 Active Server Pages 組件化版本。 返回到頂部 運行庫技術問題術語什么是公共語言運行庫 (CLR)?公共語言運行庫是用于 .NET 框架應用程序的執行引擎。 它提供若干服務,包括:
返回到頂部 什么是通用類型系統 (CTS)?通用類型系統是一個內置在公共語言運行庫中的豐富的類型系統,它支持大多數編程語言中存在的類型和操作。通用類型系統支持廣泛的編程語言的完整實現。 返回到頂部 什么是公共語言規范 (CLS)?公共語言規范是一組構造和約束,它充當庫編寫器和編譯器編寫器的向導。它使庫完全可通過任何支持 CLS 的語言使用,并使那些語言可以相互集成。公共語言規范是通用類型系統的一個子集。對于正在編寫將由其他開發人員使用的代碼的應用程序開發人員,公共語言規范也非常重要。當開發人員按照 CLS 規則設計可公開訪問的 API 時,這些 API 很容易通過面向公共語言運行庫的所有其他編程語言使用。 返回到頂部 什么是 Microsoft 中間語言 (MSIL)?MSIL 是與 CPU 無關的指令集,其中編譯進了 .NET 框架程序。它包含在對象上加載、存儲、初始化和調用方法的指令。 在與元數據及公共類型系統組合后,MSIL 允許真正的語言間集成。 在執行之前,MSIL 將轉換成機器碼,并且不被解釋。 返回到頂部 什么是托管代碼和托管數據?托管代碼是為面向公共語言運行庫的服務編寫的代碼(請參閱“什么是公共語言運行庫?”)。為了面向這些服務,該代碼必須向運行庫提供最低級別的信息(元數據)。默認情況下,所有 C#、Visual Basic .NET 和 JScript .NET 代碼都受托管。默認情況下,Visual Studio .NET C++ 代碼不受托管,但編譯器可以通過指定命令行開關 (/CLR) 來產生托管代碼。 與托管代碼密切相關的是托管數據(由公共語言運行庫的垃圾回收器分配和釋放的數據)。默認情況下,C#、Visual Basic 和 JScript .NET 數據受托管。然而,通過使用特殊的關鍵字可以將 C# 數據標記為非托管。默認情況下,Visual Studio .NET C++ 數據不受托管(即使在使用 /CLR 開關時),但在使用 C++ 托管擴展時,可以通過使用 __gc 關鍵字將類標記為托管。正如名稱所暗示的,這意味著用于類實例的內存受垃圾回收器的托管。另外,類成為 .NET 框架社區的一名完全參與的成員,這既帶來了好處,也帶來了限制。其中一個好處是與用其他語言編寫的類的正確互操作性(例如,托管 C++ 類可以從 Visual Basic 類繼承)。其中一個限制是托管類只能從基類繼承。 返回到頂部 程序集什么是程序集?程序集是 .NET 框架應用程序的主要構造塊。它是一個功能集合,并以單個實現單元(一個或多個文件)的形式生成、版本化和部署。所有托管類型和資源或者只在其實現單元中標記為可訪問,或者在該單元外由代碼標記為可訪問。 程序集通過其清單(每個程序集不可缺少的部分)進行自我描述。清單可以:
該信息在運行時用于解析引用、強制版本綁定策略和驗證加載程序集的完整性。運行庫可以確定和定位任何運行對象的程序集,因為每個類型均加載在程序集的上下文中。程序集也是應用代碼訪問安全權限的單元。在確定給程序集包含的代碼授予什么權限時,分別考慮每個程序集的標識證據。 程序集自我描述的特性也有助于使無影響安裝和 XCOPY 部署可行。 返回到頂部 什么是專用程序集和共享程序集?專用程序集僅由單個應用程序使用,并存儲在該應用程序的安裝目錄中(或其中的子目錄中)。共享程序集是一個可以由多個應用程序引用的程序集。為了共享程序集,必須給予該程序集一個加密的強名稱(有時又稱強名稱),為此目的顯式生成程序集。相比之下,專用程序集名稱只需在使用它的應用程序中是唯一的。 通過區分專用程序集和共享程序集,我們以顯式決策的形式引入共享概念。只需將專用程序集部署到應用程序目錄,即可保證該應用程序只與用來生成和部署它的位一起運行。對專用程序集的引用只被本地解析到專用應用程序目錄。 可以舉出多個生成和使用共享程序集的理由,如表示版本策略的能力。共享程序集有一個加密的強名稱,這意味著只有此程序集的作者具有產生程序集新版本的密鑰。因此,如果您生成一個策略語句,表明自己希望接受程序集的新版本,則應確信版本更新將受作者的控制和驗證。否則,您不必接受它們。 對于本地安裝的應用程序,共享程序集通常被顯式安裝到全局程序集緩存中(由 .NET 框架維護的程序集的本地緩存)。.NET 框架版本管理功能的關鍵是:下載的代碼不影響本地安裝的應用程序的執行。下載的代碼放置在特殊的下載緩存中,并且在計算機上不是全局可用的,即使以共享程序集的形式生成了某些下載組件。 .NET 框架隨附的類均以共享程序集的形式生成。 返回到頂部 如果要生成共享程序集,需要簽名和管理密鑰對的系統開銷嗎?生成共享程序集的確涉及使用加密密鑰。在生成程序集時,只有公鑰是確實需要的。面向 .NET 框架的編譯器在生成程序集時提供命令行選項(或使用自定義屬性)來提供公鑰。常見的做法是在源數據庫中保留通用公鑰的一個副本,并將生成腳本指向該密鑰。在交付程序集前,必須用相應的私鑰完全簽名程序集。用稱為 SN.exe(強名稱)的 SDK 工具來完成此工作。 與 Authenticode 不同,強名稱簽名不涉及證書。不涉及第三方單位,沒有要支付的費用,也沒有證書鏈。另外,驗證強名稱比驗證 Authenticode 的系統開銷低得多。然而,強名稱不就是否信任特定的發布者做出任何聲明。強名稱使您可以確保給定程序集的內容沒有被篡改,并且在運行時以您的名義加載的程序集來自您開發時所針對的同一發布者。但它不就是否可以信任此發布者的標識做出任何聲明。 返回到頂部 命名空間名稱和程序集名稱之間的差異是什么?命名空間是類型的邏輯命名方案,此方案中簡單的類型名稱(如 MyType)用以點分隔的分層名稱開頭。這樣的命名方案完全受開發人員控制。例如,類型 MyCompany.FileAccess.A 和 MyCompany.FileAccess.B 可能在邏輯上應具有與文件訪問相關的功能。.NET 框架使用分層命名方案將類型分為相關功能(例如 ASP.NET 應用程序框架)或遠程處理功能的邏輯類別。設計工具可以利用命名空間使開發人員在代碼中瀏覽和引用類型更容易。命名空間的概念與程序集的概念無關。單個程序集可以包含分層名稱具有不同命名空間根的類型,而邏輯命名空間根可以跨越多個程序集。在 .NET 框架中,命名空間是邏輯設計時命名便利,而程序集在運行時建立類型的名稱范圍。 返回到頂部 應用程序部署和隔離哪些選項可用于部署 .NET 應用程序?.NET 框架通過使應用程序的無影響安裝和 XCOPY 部署切實可行來簡化部署。由于所有請求均首先解析到專用應用程序目錄,只需將應用程序的目錄文件復制到磁盤便可運行該應用程序。不需要任何注冊。 該方案對 Web 應用程序、Web 服務和獨立的桌面應用程序尤為迫切。然而,在某些情況下,XCOPY 作為分發機制是不充分的。應用程序只有很少的專用代碼并且依賴于共享程序集的可用性,或者應用程序不是在本地安裝的(而是按需下載的)便屬于這種情況。在上述情況下,.NET 框架提供大量的代碼下載服務以及與 Windows 安裝程序的集成。相對于當前平臺,.NET 框架提供的代碼下載支持提供了一些優點,包括增量下載、代碼訪問安全性(沒有其他 Authenticode 對話框)和應用程序隔離(代表一個應用程序下載的代碼不影響其他應用程序)。Windows 安裝程序是另一個可用于 .NET 應用程序的功能強大的部署機制。Windows 安裝程序的所有功能(包括發布、公布和應用程序修復)均適用于 Windows 安裝程序 2.0 中的 .NET 應用程序。 返回到頂部 我已經編寫了要在多個應用程序中使用的程序集。在哪里部署它?將要由多個應用程序使用的程序集(如共享程序集)被部署到全局程序集緩存中。在預發布版和 Beta 版中,使用 GACUtil SDK 工具的 /i 選項將程序集安裝到緩存中: gacutil /i myDll.dll Windows Installer 2.0(隨附在 Windows XP 和 Visual Studio .NET 中)能夠將程序集安裝到全局程序集緩存。 返回到頂部 如何查看全局程序集緩存中安裝的程序集?.NET 框架提供了一個用于查看程序集緩存的 Windows 外殼程序擴展。通過 Windows 資源管理器導航至 % windir%\assembly 將激活查看器。 返回到頂部 什么是應用程序域?應用程序域(通常為 AppDomain)是一個用于隔離應用程序的虛擬進程。在同一應用程序范圍內(換句話說,以應用程序入口點開頭的對象激活序列中的任何位置)創建的所有對象都創建在同一應用程序域中。多個應用程序域可以存在于單個操作系統進程中,這使它們成為應用程序隔離的輕量方法。 操作系統進程通過提供一個獨特的內存地址空間來提供隔離。雖然這很有效,但成本很高,而且不能擴展到大型 Web 服務器所需的數目。另一方面,公共語言運行庫通過管理運行在應用程序域中的代碼的內存使用來強制應用程序隔離。這可確保它不會訪問域邊界以外的內存。注意只有類型安全代碼才能以這種方式進行管理(運行庫在不安全代碼加載到應用程序域中時無法保證隔離)很重要。 |
溫馨提示:喜歡本站的話,請收藏一下本站!