專利名稱::將操作系統(tǒng)的本機應(yīng)用編程接口投射到其他編程語言的制作方法將操作系統(tǒng)的本機應(yīng)用編程接口投射到其他編程語言
背景技術(shù):
:操作系統(tǒng)典型地具有幾個應(yīng)用編程接口,這些應(yīng)用編程接口允許應(yīng)用訪問由操作系統(tǒng)支持的功能性。這樣的API典型地由操作系統(tǒng)通過使用某種計算機編程語言中的命名文件或?qū)ο蠖灰?guī)定。例如,C編程語言使用可能具有諸如“interface.h”那樣的名字的首標文件。同樣地,在C#中,稱為“P/Invoke”簽名的機制被使用來訪問操作系統(tǒng)API。編寫將利用操作系統(tǒng)API的計算機程序的人典型地在程序中包括對命名的API文件或?qū)ο蟮囊?,或使用由編程語言提供的另一種機制。該程序于是例如包括按照由該API使用的語法的、對由該API定義的函數(shù)的調(diào)用(calI)。以這種方式定義的API不能由與它們被編寫的語言不同的語言直接訪問。為了使得用其他語言編寫的程序可訪問API,API被“包裝(wrap)”。這種包裝典型地必須按API和按語言來人工地完成,并需要深入理解目標語言和API以及操作系統(tǒng)。因此,許多操作系統(tǒng)API是無法使用的。
發(fā)明內(nèi)容本概要被提供來以簡化的形式介紹概念的選擇,這些概念在下面的詳細說明中被進一步描述。本概要既不打算確認所要求保護的主題的關(guān)鍵特征或必要特征,也不打算被使用來限制所要求保護的主題的范圍。當構(gòu)建操作系統(tǒng)時,關(guān)于API的信息被生成并被以已知的格式存儲在操作系統(tǒng)內(nèi)的已知位置。這個信息充分描述由操作系統(tǒng)所顯露的(expose)所有的API。這包括(但不限于)各種各樣類型的關(guān)于API的命名元素的信息,諸如基本類型、枚舉類型、結(jié)構(gòu)、委托(delegate)、接口、類(class)、方法、屬性和事件。這個信息被存儲在API元數(shù)據(jù)文件中。語言編譯器或解釋器使用這個API信息來用目標語言構(gòu)建本機(native)系統(tǒng)API的自然的和熟悉的表示。這個表示隨不同的語言而變化(因為所謂的自然的和熟悉的東西是隨不同的語言而變化的)。語言編譯器或解釋器可以在編譯時和/或運行時間讀取API信息,什么時間對所討論的語言最適當就在什么時間。例如,類似C++那樣的靜態(tài)編譯的語言將僅僅在編譯時消費(consume)元數(shù)據(jù),而類似Python或JavaScript那樣的動態(tài)語言將僅僅在運行時間消費元數(shù)據(jù)。類似.NET或Java那樣的環(huán)境多半既在編譯又在運行時消費元數(shù)據(jù)。元數(shù)據(jù)被使用來允許應(yīng)用引用在API中的命名的元素。構(gòu)建了投射(projection),所述投射使用元數(shù)據(jù)來把API中的命名元素映射為在目標語言中的命名元素,以及定義包裝器,所述包裝器對在目標表示和本機操作系統(tǒng)表示之間的那些元素的數(shù)據(jù)進行編組(marshal)。因此,一方面,描述操作系統(tǒng)的應(yīng)用編程接口的元數(shù)據(jù)被存儲在存儲器中。假設(shè)有引用了應(yīng)用編程接口之一的元素的、在按照某個編程語言的程序中的命名元素的指示,該命名元素通過使用元數(shù)據(jù)被投射到該編程語言中。投射可以在程序的編譯或解釋期間出現(xiàn)。投射可包括產(chǎn)生創(chuàng)建該編程語言中的一個或多個元素的代碼,以及按照類型來對用于所創(chuàng)建的元素的數(shù)據(jù)編組。接口一一包括它們的方法、屬性和事件一一也可以被如此投射。投射還可以包括將異常(exception)從操作系統(tǒng)傳播到應(yīng)用。操作系統(tǒng)API到其他語言的這樣的投射可以在計算機實施的過程中,在包括一個或多個計算機存儲媒體的制造品中,或在計算機器中被體現(xiàn)。在以下的說明中,參考了形成本說明的一部分的附圖,且在圖上,作為舉例說明,顯示了本技術(shù)的具體的示例性實現(xiàn)。應(yīng)當理解,可以利用其它實施例以及可以做出結(jié)構(gòu)的改變而不背離本公開內(nèi)容的范圍。圖I是包括API到其它編程語言的投射的系統(tǒng)的框圖。圖2是圖示開發(fā)工具的示例性操作的流程圖。圖3是圖示編譯器或解釋器的示例性操作的流程圖。圖4是可以在其中實施這樣的系統(tǒng)的示例性計算設(shè)備的框圖。具體實施例方式下面的段落提供在其中可以實施本機系統(tǒng)API到其它語言的這樣的投射的示例性操作環(huán)境。參照圖1,運行的應(yīng)用100在運行時間期間訪問操作系統(tǒng)104的本機系統(tǒng)API102。為了使這樣的應(yīng)用具有這樣的功能性,典型地通過使用諸如編輯器那樣的開發(fā)工具112來編寫程序106。這樣的程序由語言的編譯器或解釋器108進行編譯或解釋,以便提供運行時應(yīng)用100。開發(fā)工具112和編譯器或解釋器108訪問充分描述操作系統(tǒng)的API102的元數(shù)據(jù)110。開發(fā)工具112幫助開發(fā)者編寫程序,但經(jīng)由元數(shù)據(jù)把可用的本機系統(tǒng)API通知開發(fā)者,且允許通過使用開發(fā)者的編程語言訪問那些API。編譯器或解釋器通過使用元數(shù)據(jù)來具體化本機系統(tǒng)API到開發(fā)者的編程語言的投射。具體地,在API中的命名元素被映射到目標語言中的命名元素,以及在那些元素中的值在由目標語言與操作系統(tǒng)所使用的格式之間進行編組。構(gòu)建這樣的系統(tǒng)是從構(gòu)建具有用元數(shù)據(jù)描述的API的操作系統(tǒng)開始的。元數(shù)據(jù)以與編程語言無關(guān)的形式表示API描述的每個命名的元素。這個元數(shù)據(jù)提供接口的完整的描述。組合的系統(tǒng)元數(shù)據(jù)可以以ECMA-335CLI格式被存儲在一系列元數(shù)據(jù)文件中,但具體的格式對于本發(fā)明是不重要的。在假設(shè)這個上下文后,將結(jié)合圖2-4更詳細地描述這樣的系統(tǒng)的示例性實現(xiàn)。在圖2上,現(xiàn)在將描述開發(fā)工具的操作的例子。當編寫計算機程序時,開發(fā)者通常使用諸如編輯器那樣的某種形式的開發(fā)工具。這個編輯器可以完成各種各樣的任務(wù),諸如驗證語法和提出使開發(fā)者輸入的字符串填充完整的建議。在這種環(huán)境下,描述操作系統(tǒng)應(yīng)用編程接口的元數(shù)據(jù)可以以各種各樣的方式被使用。具體地,它可被使用來允許開發(fā)者發(fā)現(xiàn)可用的API。開發(fā)工具接收200字符串輸入,諸如可以在API中被用作為標識符(諸如“鼠標”)或名字空間(諸如,操作系統(tǒng)的名稱)的關(guān)鍵字。元數(shù)據(jù)可以被搜索202,以便識別把接收的輸入作為標識符或名字空間的一部分的元素。用于該組匹配的元素的標識符可以被收集和返回204給開發(fā)工具。開發(fā)工具可以把這些元素呈現(xiàn)206給開發(fā)者以供選擇,并且使用來自元數(shù)據(jù)的信息,以適合于開發(fā)者正在使用的計算機語言的格式呈現(xiàn)這樣的元素?,F(xiàn)在參照圖3,現(xiàn)在將描述語言編譯器或解釋器的操作的例子。在處理計算機程序時,無論是編譯還是解釋它,均檢測300計算機程序的元素的序列。確定302計算機程序的元素是否是對操作系統(tǒng)的API的引用。例如,這可以通過在元數(shù)據(jù)中查找該元素而被確定。通過使用元數(shù)據(jù),創(chuàng)建304投射元素,其允許在計算機程序與操作系統(tǒng)之間交換數(shù)據(jù)。具體地,編譯器或解釋器實施操作系統(tǒng)API中的命名元素到目標語言中的命名元素的投射。元數(shù)據(jù)允許創(chuàng)建對象,和在由程序使用的數(shù)據(jù)格式與由操作系統(tǒng)使用的格式之間對值編組。在運行時間,這個元素允許程序訪問306操作系統(tǒng)的API,和在應(yīng)用與操作系統(tǒng)之間對數(shù)據(jù)編組。在目前描述了這樣的系統(tǒng)的總的操作后,現(xiàn)在將描述特定的例子。具體地,現(xiàn)在將描述在描述API的元數(shù)據(jù)與該API的元素的計算機語言特定的表示之間的示例性投射的更多細節(jié)。以下的描述僅僅是一個可能的實現(xiàn),而并不被看作為是對本發(fā)明的限制。具體地,應(yīng)當理解,下面僅僅是可以被實施的語言投射的例子,以及用于這種語言的其它實現(xiàn)是可能的,且到其他語言的其他投射是可能的。在本例中,JavaScript是本機系統(tǒng)API通過使用元數(shù)據(jù)將被投射到的編程語言。在下面的例子中,給出如何把某些種類的元素投射到JavaScript編程語言的說明。當腳本(script)試圖創(chuàng)建由操作系統(tǒng)API定義的特定對象的實例時,投射器對象負責訪問元數(shù)據(jù)以創(chuàng)建在不同類型之間轉(zhuǎn)換數(shù)據(jù)、可能牽涉到創(chuàng)建代理對象的編組存根(marshalstub),以及負責調(diào)度方法調(diào)用、管理事件和管理回調(diào)函數(shù)。對于是諸如整數(shù)、字符串等等那樣的基本類型的命名元素,下面是把那些API元素投射到JavaScript的方式。操作系統(tǒng)具有幾種帶符號和不帶符號整數(shù)類型,諸如一字節(jié)的不帶符號整數(shù)(UInt8)、四字節(jié)的不帶符號整數(shù)(nnt32)、四字節(jié)的帶符號整數(shù)(Int8)、以及八字節(jié)的帶符號和不帶符號整數(shù)(nnt64和Int64)。這些類型的命名元素被投射為JavaScript數(shù)值(Numbervalue)。當JavaScript數(shù)被編組到操作系統(tǒng)值中時,則所述值的類型被強制成JavaScript數(shù),隨后是由ES5ToInt32規(guī)范所定義的過程。對于nnt8,結(jié)果施加了模2~8。對于1社32,施加模2~16。對于UInt32,施加模2~32。被編組到JavaScript值中的64比特整數(shù),如果是帶符號的,若落入[_2~53,2~53]范圍中,或如果是不帶符號的,若落入范圍中,則被表示為標準的數(shù)值。如果它落在這個范圍以外,則它被表示為具有定制的后備存儲(backingstore)的數(shù)值,該定制的后備存儲保存全部64比特整數(shù)數(shù)據(jù)。對于這些定制的數(shù)值進行的數(shù)學(xué)運算使得該值被強制成處在[_2~53,2~53]范圍中的標準數(shù)字表示,或者在不帶符號的情況下是處在[O,2~53]范圍中的標準數(shù)字表示。如果該值處在這個范圍以外,則將引發(fā)類型錯誤(TypeError)。被編組成64比特整數(shù)的JavaScript值在它本身是被投射的值的情況下被直接分派;否則,傳送對于該值施加EC5“Tolnteger”轉(zhuǎn)換的結(jié)果。操作系統(tǒng)API的、是字符(用16比特統(tǒng)一代碼(Unicode)表示)、字符串或全球唯一標識符(⑶ID)的命名元素可以被表示為JavaScript字符串,以及被投射成JavaScript中的命名的字符串。被編組到JavaScript中的字符被轉(zhuǎn)換成包含用統(tǒng)一代碼值表示的單個字符的JavaScript字符串值。被編組成字符的JavaScript值的類型經(jīng)由ES5ToString操作被強制成JavaScript字符串,且第一個字符被保留。然后該單個字符作為Charl6值被傳遞。被編組到JavaScript中的字符串被轉(zhuǎn)換成JavaScript字符串。被編組成字符串的JavaScript值的類型被強制成JavaScript字符串。被編組成JavaScript值的⑶ID被轉(zhuǎn)換成字符串格式。被編組成⑶ID的JavaScript值的類型被強制成字符串,然后被解析成由操作系統(tǒng)使用的格式。操作系統(tǒng)可以具有帶有如下的命名元素的API,即該命名元素是表示時間點的日期時間結(jié)構(gòu)體(struct)或是表示時間量的時間跨度結(jié)構(gòu)體。日期時間結(jié)構(gòu)可被投射到JavaScript中作為日期實例,其具有匹配于日期時間結(jié)構(gòu)體數(shù)據(jù)(它具有與日期實例不同的范圍和精度)的后備存儲。時間跨度結(jié)構(gòu)體被轉(zhuǎn)換成毫秒,并作為JavaScript數(shù)被返回。同樣地,JavaScript數(shù)可以從毫秒被轉(zhuǎn)換到100-納秒單位,以作為時間跨度結(jié)構(gòu)體進行傳遞。應(yīng)當指出,通過解釋元數(shù)據(jù),在某些情形下,投射也可以把來自本機環(huán)境的類型重新映射成在語言投射中的現(xiàn)有類型。例如,當在本機API和語言投射中的類型具有可兼容的數(shù)據(jù)布局時(這對于基本數(shù)據(jù)類型可以容易地出現(xiàn)),這是可能的和想要的。通過元數(shù)據(jù)映射,投射可以簡單地把所有的操作,諸如在語言類型上的方法或?qū)傩?,直接重新定向到本機類型。這使得那些類型的使用對于語言開發(fā)者而言是更自然和熟悉的。例如,日期時間結(jié)構(gòu)重新映射可以以這樣的方式被實施。在本機API中,日期時間結(jié)構(gòu)被顯露為在元數(shù)據(jù)中的Windows.Foundation.DataTime,而不用任何附加的操作。在C#投射中,這種類型可以通過豐富的支持,被重新定向到在C#中的System.DataTimeOffset。作為另一個例子,如果在API中的命名元素是方法,則它把值HRESULT作為它的返回類型,其被轉(zhuǎn)換成JavaScript中的異常事件。返回的HRESULT由JavaScript引擎檢驗是否成功。如果HRESULT指示失敗,則JavaScript引擎在JavaScript側(cè)拋出(throw)異常事件。因此,對于啟用(invoke)操作系統(tǒng)API的方法的JavaScript,HRESULT失敗被表面化(surface)為JavaScript異常事件。對于消費JavaScript方法的API方法(諸如,對于以下描述的回調(diào)或委托),JavaScript方法調(diào)用被包裝在異常事件塊中(或者是如由宿有API的JavaScript提供的等同物),這樣使得所捕獲的異常事件可作為HRESULTS被傳播。然而,操作系統(tǒng)也允許HRESULT處在方法和屬性的入或出參數(shù)位置中。在這些情形下,HRESULTS被編組為不帶符號32比特值(如以上描述的)。對于在API中是枚舉類型的命名元素(其是一組命名的常數(shù)),這些在JavaScript中被表示為對于每個命名值包含一只讀字段的對象。對于在API中是“結(jié)構(gòu)體”的命名元素(命名的數(shù)據(jù)字段的集合),這些在JavaScript中被表示為JavaScript對象。被編組到JavaScript中的結(jié)構(gòu)體被轉(zhuǎn)換成對象。在結(jié)構(gòu)體中的每個命名的字段變?yōu)樵贘avaScript對象中的命名的屬性。在結(jié)構(gòu)體中的每個命名的字段的值按字段的底層(underlying)類型被編組。是對象類型的JavaScript值可以被編組到結(jié)構(gòu)體中。JavaScript對象或它的原型對于結(jié)構(gòu)體的每個命名的字段包含一命名字段,以及每個命名字段的值按照底層類型被編組。在JavaScript對象中的、不具有操作系統(tǒng)API結(jié)構(gòu)體中的等同物的額外字段被忽略。如果任何結(jié)構(gòu)體值的編組失敗,則返回編組錯誤。在本例中,操作系統(tǒng)不具有用于數(shù)組的類型,而代之以允許對方法的自變量是一個配對,即不帶符號整數(shù)長度(它表示在數(shù)組中元素的數(shù)量,而不是字節(jié)),后隨指向數(shù)組的第一元素的指針。當把數(shù)組編組到JavaScript中時,具有以下特征的對象被創(chuàng)建。該對象具有針對在O與數(shù)組的長度減I之間的每個整數(shù)值的屬性一一它們是可枚舉的、可寫入的和不可配置的,以及最初被設(shè)置為向量的長度的“長度”屬性,它是不可寫入的、不可枚舉的和不可配置的。它的原型是數(shù)組原型對象。它的對索引(index)屬性的[[Put]]操作設(shè)置在底層的本機數(shù)組上規(guī)定的索引。它的對索引屬性的[[GetOwnProperty]]操作索引到底層的本機數(shù)組中。它不具有作為“數(shù)組”的[[class]]。當編組JavaScript對象時,如果對象具有[[class]]“數(shù)組”,則數(shù)組被復(fù)制到本機數(shù)組中,并且傳遞對于這個數(shù)組的引用。如果對象是投射的數(shù)組,則傳遞底層的本機數(shù)組。API還可以具有是委托或回調(diào)函數(shù)的命名元素,它是對單個可啟用(invokable)的方法的引用。這些可被投射到JavaScript中作為可調(diào)用的對象。投射器將回調(diào)委托包裝在定制的編組的對象中。被編組到JavaScript中的委托被包裝在JavaScript函數(shù)對象中。當函數(shù)對象被啟用(invoke)時,自變量被編組到如由委托所規(guī)定的等同的參數(shù)類型中,然后包裝的委托對象被啟用。如果任何自變量無法被編組,則委托調(diào)用失敗。如果比起參數(shù)中的委托有更少的JavaScript自變量,貝U委托調(diào)用失敗。超出參數(shù)中的委托以外的額外JavaScript自變量被忽略。在委托被啟用后,外出的參數(shù)被編組成JavaScript類型。如果任何外出的參數(shù)無法被編組,則委托調(diào)用失敗。然后,外出的參數(shù)被編組到JavaScript值,并且被返回。如果本機JavaScript函數(shù)對象正被編組到委托中,則那個可調(diào)用的對象被包裝在對應(yīng)委托類型的委托中。當委托被啟用時,進入的參數(shù)被編組到JavaScript類型中,然后,JavaScript函數(shù)對象被啟用。如果任何的自變量無法被編組,則委托調(diào)用失敗。在委托被啟用后,返回的值根據(jù)以下的規(guī)則被映射成該委托的外出的參數(shù)。首先,如果沒有外出的參數(shù),則來自JavaScript函數(shù)對象的返回值被忽略。第二,如果委托規(guī)定了單個外出的參數(shù),則來自JavaScript函數(shù)對象的返回值被編組到該類型中。如果該編組失敗,則委托調(diào)用失敗。第三,如果所述委托規(guī)定多個外出參數(shù),則來自JavaScript函數(shù)對象返回值的返回值是具有對于每個外出參數(shù)的命名屬性的對象。每個命名屬性被編組到對應(yīng)的外出參數(shù)的類型中。如果返回值不是對象,則委托調(diào)用失敗。如果返回的對象不包含對于每個外出參數(shù)的命名屬性,則委托調(diào)用失敗。如果返回的對象包含不對應(yīng)于外出參數(shù)的額外的命名屬性,則它們被忽略。如果任何的命名屬性無法被編組到對應(yīng)的外出參數(shù)類型,則委托調(diào)用失敗。以下的例子圖示用于被稱為IStringCollection的委托的元數(shù)據(jù),和創(chuàng)建這個委托的實例的偽-JavaScript代碼。示例性元數(shù)據(jù)[uuid(…)]delegateHRESULTComparer([in]HSTRINGsi,[in]HSTRINGs2,[out,retval]Boolean*value)interfaceIStringCollection{HRESULTSort([in]Comparercompare);}偽-JavaScriptIl創(chuàng)建實現(xiàn)IStringCollection的類的實例strCol=getIStringCoIIection()strCol.sort(function(si,s2){returnsl>s2;});接口不是作為對象直接投射到JavaScript中。然而,接口可以是參數(shù),并且返回操作系統(tǒng)API方法的類型。為了提供在目標編程語言中自然的投射,在以上的例子中,成員被投射到JavaScript中,使它們的名字更改為camelCase,遵循JavaScript中的強的規(guī)范,以便對于成員使用camelCase名字。類型--類似于JavaScript構(gòu)造器函數(shù)--通常是PascalCased,并且以該形式被投射。同樣地,用于addEventListener模式的枚舉屬性、結(jié)構(gòu)體字段、事件名稱在camelCase中都有名字。被編組到JavaScript中的、根據(jù)靜態(tài)類型信息不知要作為運行時間類的表示的接口實例經(jīng)歷以下步驟。首先,進行該接口的調(diào)用,以得到用于該接口的運行時間類名稱。如果成功的話,則對象被投射為運行時間類實例對象(下面描述的)。否則,對象就好像它是未命名的運行時間類的實例那樣被投射,該實例正好實現(xiàn)已知要實現(xiàn)的接口和它的間接(transitively)需要的接口。檢查被編組到接口類型的JavaScript值,以便弄明白它是投射的運行時間類實例對象還是投射的接口實例對象。如果它是運行時間類對象,以及該對象代理的原始值實現(xiàn)了接口類型,則該接口的對象實現(xiàn)被傳遞到操作系統(tǒng)。否則,引發(fā)類型錯誤異常事件。在操作系統(tǒng)API中的對象可以是運行時間類的實例。運行時間類實現(xiàn)一組一個或多個接口(在下面定義)。某個運行的對象的被實現(xiàn)接口的列表可以根據(jù)返回該運行的對象的方法的元數(shù)據(jù)或通過訪問運行時間類名稱并查找元數(shù)據(jù)而被確定。由于JavaScript是一種基于原型的動態(tài)語言,所以它沒有類的構(gòu)造。類構(gòu)造在JavaScript中作為對象被投射。因此,操作系統(tǒng)API對象在JavaScript中作為對象被投射。在類的所有被實現(xiàn)接口上定義的方法、屬性和事件的聯(lián)合代表了類型成員,所述類型成員經(jīng)由被投射的JavaScript對象的原型被顯露為在被投射的JavaScript對象上可用的命名的屬性。JavaScript語言投射的消費者可以直接訪問該類的任何成員而不用關(guān)心該成員實際上是在哪個接口上被定義的。JavaScript對象是動態(tài)的,這意味著,可以在任何時間在對象上添加或去除新的屬性。被投射的對象可以支持添加新的屬性和方法,只要預(yù)定義的接口成員不被廢棄(override)或刪除即可。在JavaScript方面,被投射的對象是可擴展的,但命名的類型成員的集合是不可配置的。被投射的對象具有原型,實例成員被定義在來自運行時間類實現(xiàn)的接口的成員集合上。如上所指出的,這樣的接口具有方法、參數(shù)和事件。在語言投射層上的方法被實現(xiàn)為vtable,每種方法一個槽(slot)。有關(guān)接口的元數(shù)據(jù)提供方法名稱以及參數(shù)的名稱、類型和方向(入/出)。方法在JavaScript中被投射為在被投射的運行時間類或接口對象上的可調(diào)用的屬性。這些屬性是{Writable(可寫)=false(假),Enumerable(可枚舉)=true(真),Configurable(可配置)=false(假)}。當被調(diào)用時,自變量按照它們對應(yīng)的參數(shù)類型被編組,所述方法被用這些值調(diào)用。返回值被編組到JavaScript值,JavaScript對象返回作為該值。在語言投射層上的屬性被實現(xiàn)為得到(get)和/或設(shè)置(set)方法。訪問該屬性值便調(diào)用所述得到方法,而更新該屬性值則啟用所述設(shè)置方法。屬性可被讀出或?qū)懭?即,得到和設(shè)置方法可用),或只被讀出(即,只有得到方法可用)。屬性在JavaScript中被投射為屬性。屬性值的編組取決于底層的屬性類型而如上所述地工作。在語言投射層上的事件被實現(xiàn)為添加和去除事件收聽者方法。添加方法取得委托實例,并返回描述收聽者的數(shù)據(jù),而去除方法取得描述收聽者的數(shù)據(jù),并且不返回任何東西。在JavaScript中,有至少一個事件投射到其上的任何被投射的運行時間類或接口對象,得到被添加到它的原型的兩個附加的屬性,addEventListener和removeEventListener。這些屬性是{Writable:false,Enumerable:true,ConfigurabIe:faIse},且它們被分派給可調(diào)用的對象。addEventListener函數(shù)取得代表要收聽的事件的名稱的字符串自變量、分派作為收聽者的回調(diào)函數(shù)和被忽略的可選的第三參數(shù)。這個函數(shù)調(diào)用底層的add_Event方法,傳遞被編組的回調(diào)函數(shù)作為委托,以及把最終得到的令牌存儲在由回調(diào)函數(shù)對象的參考身份鎖上(key)的映像(map)中。removeEventListener函數(shù)取得代表要從中去除收聽者的事件的名稱的字符串自變量、應(yīng)當被去除的回調(diào)函數(shù)和被忽略的可選的第三參數(shù)。這個函數(shù)通過在所存儲令牌的映像中的參考身份而查找回調(diào)函數(shù),以及如果找到令牌,則調(diào)用底層的rem0Ve_EVent方法,傳遞檢索到的令牌。當事件被激發(fā)(fire)時,將啟用被作為回調(diào)來傳遞的任何JavaScript函數(shù)對象。被傳遞到該函數(shù)對象的自變量將是被提供給EventHandler委托的自變量的經(jīng)編組的值。如前文所示,通過具有用于語言的API投射層,由被存儲在操作系統(tǒng)中的元數(shù)據(jù)所規(guī)定的操作系統(tǒng)API的命名元素可被使用來自動創(chuàng)建對象,并且在操作系統(tǒng)API格式與應(yīng)用編程語言格式之間對數(shù)據(jù)編組。應(yīng)當理解,前文僅僅是在示例性操作系統(tǒng)與示例性編程語言之間的投射的例子,而本發(fā)明不限于這個例子。在目前描述了示例性實現(xiàn)后,現(xiàn)在將描述這樣的系統(tǒng)被設(shè)計來在其中操作的計算環(huán)境。以下的說明打算提供其中可以實施這種系統(tǒng)的適用的計算環(huán)境的概略的、一般的描述。所述系統(tǒng)可以通過許多通用或?qū)S玫挠嬎阌布渲帽粚嵤?。可以適用的熟知的計算設(shè)備的例子包括,但不限于,個人計算機、服務(wù)器計算機、手持或膝上型設(shè)備(例如,媒體播放器、筆記本電腦、蜂窩電話、個人數(shù)據(jù)助理、錄音機)、多處理器系統(tǒng)、基于微處理器的系統(tǒng)、機頂盒、游戲控制臺、可編程消費電子裝置、網(wǎng)絡(luò)PC、小型計算機、大型計算機、包括任何的上述系統(tǒng)或設(shè)備的分布式計算環(huán)境等等。圖4圖示適用的計算系統(tǒng)環(huán)境的例子。該計算系統(tǒng)環(huán)境僅僅是適用的計算環(huán)境的一個例子,且不打算用來對這樣的計算環(huán)境的使用或功能性的范圍提出任何限制。該計算環(huán)境不應(yīng)當被解釋為具有涉及在示例性操作環(huán)境中圖示的任一部件或部件組合的依賴性或要求。參照圖4,示例性計算環(huán)境包括計算機器,諸如計算機器400。在它的最基本的配置中,計算機器400典型地包括至少一個處理單元402和存儲器404。該計算設(shè)備可包括多個處理單元和/或附加的共同處理單元,諸如圖形處理單元420。取決于計算設(shè)備的確切配置和類型,存儲器404可以是易失性(諸如RAM)、非易失性(諸如ROM、閃存等等)或這二者的某種組合。這種最基本的配置在圖4上用虛線406圖示。另外,計算機器400還可以具有附加的特征/功能性。例如,計算機器400還可以包括附加的存儲裝置(可拆卸的和/或非可拆卸的),包括,但不限于,磁盤或光盤或磁帶。這樣的附加的存儲裝置在圖4上用可拆卸的存儲裝置408和非可拆卸的存儲裝置410圖示。計算機存儲媒體包括以任何方法或技術(shù)實施的、用于存儲諸如計算機程序指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù)那樣的信息的易失性和非易失性的、可拆卸和非可拆卸的媒體。存儲器404、可拆卸的存儲裝置408和非可拆卸的存儲裝置410都是計算機存儲媒體的例子。計算機存儲媒體包括,但不限于,RAM、R0M、EEPR0M、閃存或其它存儲器技術(shù)、⑶-ROM、數(shù)字多功能盤(DVD)或其它光學(xué)存儲裝置、盒式磁帶、磁帶、磁盤存儲裝置或其他磁存儲設(shè)備、或可被使用來存儲想要的信息并可以由計算機器400訪問的任何其它介質(zhì)。任何這樣的計算機存儲媒體可以是計算機器400的一部分。計算機器400還可以包含通信連接412,其允許所述設(shè)備與其它設(shè)備通信。通信連接412是通信媒體的例子。通信媒體典型地以諸如載波或其它輸送機制那樣的調(diào)制的數(shù)據(jù)信號承載計算機程序指令、數(shù)據(jù)結(jié)構(gòu)、程序模塊或其它數(shù)據(jù),并且通信媒體包括任何信息傳遞媒體。術(shù)語“調(diào)制的數(shù)據(jù)信號”是指這樣的信號,即該信號使它的特性中的一個或多個以這樣的方式被設(shè)置或改變使得將信息編碼在信號中,由此改變信號的接收設(shè)備的配置或狀態(tài)。作為例子,而不是限制,通信媒體包括有線媒體,諸如有線網(wǎng)或直接連線的連接,以及包括無線媒體,諸如聲學(xué)、RF、紅外和其它無線媒體。計算機器400可以具有各種輸入設(shè)備414,諸如顯示器、鍵盤、鼠標、筆、照相機、觸摸輸入設(shè)備等等。還可以包括輸出設(shè)備416,諸如揚聲器、打印機等等。所有的這些設(shè)備在本領(lǐng)域都是熟知的,在這里不需要詳細討論。本系統(tǒng)可以在軟件的一般上下文中被實施,所述軟件包括由計算機器處理的計算機可執(zhí)行的指令和/或計算機解釋的指令,諸如是程序模塊。通常,程序模塊包括例行程序、程序、對象、構(gòu)件、數(shù)據(jù)結(jié)構(gòu)等等,它們在被處理單元處理時指令處理單元執(zhí)行特定的任務(wù)或?qū)嵤┨囟ǖ某橄髷?shù)據(jù)類型。本系統(tǒng)可以在分布式計算環(huán)境下被實踐,其中任務(wù)是由通過通信網(wǎng)鏈接的遠程處理設(shè)備執(zhí)行的。在分布式計算環(huán)境中,程序模塊可以位于包括存儲器存儲設(shè)備的本地和遠端計算機存儲媒體中。在所附權(quán)利要求的前序中的術(shù)語“制造品”、“過程”、“機器”、和“事物的組成”打算用來把權(quán)利要求限制到這樣的主題,即所述主題被認為屬于由35U.S.C.§101中的這些術(shù)語定義的可專利主題的范圍內(nèi)。這里描述的任何的或所有的前述替換實施例可以以想要的任何組合被使用來形成另外的混合實施例。應(yīng)當理解,在所附權(quán)利要求中定義的主題不必限于上述的特定實現(xiàn)。上述的特定實現(xiàn)僅僅作為例子被公開。權(quán)利要求1.一種計算機實施的過程,包括將描述操作系統(tǒng)(104)的應(yīng)用編程接口(102)的元數(shù)據(jù)(110),接收進存儲器中;接收(300)引用所述應(yīng)用編程接口之一的元素的、在按照編程語言的程序中的命名元素的指示;以及使用該元數(shù)據(jù),投射(304)該應(yīng)用編程接口的該命名元素。2.權(quán)利要求I的計算機實施的過程,其中投射包括當程序被編譯時,產(chǎn)生創(chuàng)建一個或多個元素的代碼,并按照類型來對用于所創(chuàng)建的元素的數(shù)據(jù)編組。3.權(quán)利要求I的計算機實施的過程,其中投射包括當程序被解釋時,產(chǎn)生創(chuàng)建一個或多個元素的代碼,并按照類型來對用于所創(chuàng)建的元素的數(shù)據(jù)編組。4.權(quán)利要求I的計算機實施的過程,其中投射包括按照類型在操作系統(tǒng)表示與應(yīng)用表示之間對數(shù)據(jù)編組。5.權(quán)利要求I的計算機實施的過程,其中投射包括投射接口,所述接口包括方法、屬性和事件。6.一種計算機器,包括一個或多個處理器;一個或多個計算機存儲介質(zhì);被存儲在計算機存儲介質(zhì)上的計算機程序指令,當被處理設(shè)備處理時,其實施在操作系統(tǒng)的應(yīng)用編程接口與按照編程語言的應(yīng)用之間的語言投射;其中應(yīng)用編程接口由被存儲在存儲器中的元數(shù)據(jù)描述;以及其中語言投射接收引用所述應(yīng)用編程接口之一的元素的、按照編程語言的命名元素的指示,以及使用所述元數(shù)據(jù)把該應(yīng)用編程接口的該命名元素投射到按照該編程語言的該應(yīng)用。7.權(quán)利要求6的計算機器,其中投射包括在編譯時,產(chǎn)生創(chuàng)建一個或多個元素的代碼,并按照類型來對用于所創(chuàng)建的元素的數(shù)據(jù)編組。8.權(quán)利要求6的計算機器,其中投射包括當程序被解釋時,產(chǎn)生創(chuàng)建一個或多個元素的代碼,并按照類型來對用于所創(chuàng)建的元素的數(shù)據(jù)編組。9.權(quán)利要求7的計算機器,其中投射包括按照類型在操作系統(tǒng)表示與應(yīng)用表示之間對數(shù)據(jù)編組。10.權(quán)利要求7的計算機器,其中投射包括投射接口,所述接口包括方法、屬性和事件。全文摘要有關(guān)操作系統(tǒng)應(yīng)用編程接口的信息以已知的格式被存儲在已知的位置。這個信息充分描述由操作系統(tǒng)顯露的API,并且被存儲在API元數(shù)據(jù)文件中。語言編譯器或解釋器使用這個API信息來用目標語言構(gòu)建本機系統(tǒng)API的自然的和熟悉的表示。語言編譯器或解釋器可以在編譯時和/或運行時間讀取所述API信息。元數(shù)據(jù)被使用來允許應(yīng)用引用API中的命名元素。構(gòu)建了投射,所述投射使用元數(shù)據(jù)來把API中的命名元素映射到目標語言中的命名元素,以及定義包裝器,所述包裝器在目標表示與本機操作系統(tǒng)表示之間對那些元素的數(shù)據(jù)編組。文檔編號G06F9/44GK102866884SQ201210317710公開日2013年1月9日申請日期2012年8月31日優(yōu)先權(quán)日2011年8月31日發(fā)明者H.皮爾森,B.雷克托爾,M.洛夫爾,M.普拉克里亞,S.羅維,T.巴蘇,R.A.弗洛達茨科,E.H.奧米亞,J.杜尼茨,A.霍爾塞克,L.W.奧斯特曼,曾煒,N.沃瓦,S.索爾卡,M.阿克西安金申請人:微軟公司