锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
: 姣斿鎴戞湁涓涓狢MyButton鐨勭被錛屾垜鐜板湪鏈変粬鐨勪竴涓猦andle
: 緙栬瘧鍣ㄦ庝箞鏍規(guī)嵁榪欎釜鍙ユ焺鎵懼埌CMyButton鐨勪唬鐮佺殑錛?/em>
銆?鍦?鏌愭煇 鐨勫ぇ浣滀腑鎻愬埌: 銆?br>: 榪欎釜鍜孫S/Compiler娌″叧緋伙紝鏄簱璧風(fēng)殑浣滅敤
: 浠ヤ粠鏌愪釜鏂囩珷閲岀湅鐨勶紝璇碝FC鐢ㄤ簡(jiǎn)涓涓ぇmap錛屾病楠岃瘉榪?br>: 鏈夋湰璁睪DI鐨勪功閲岋紝鐢ㄤ簡(jiǎn)WNDCLASS閲岀殑extra bytes鏉ュ疄鐜扮殑榪欎釜鏄犲皠
MFC鐨勫簲鐢ㄩ噷錛屾瘡涓狹FC綰跨▼錛堝繀欏昏浣跨敤MFC鏂瑰紡鍚姩鐨勭嚎紼嬶級(jí)閮界淮鎶ゆ湁涓涓狹FC object鍜孒WND涔嬮棿鐨?/p>
mapping錛屾暣涓狹FC妗嗘灦灝辨槸浣跨敤榪欎釜鏈哄埗鏉ュ疄鐜板簲鐢ㄧ駭C++瀵硅薄鍜岀郴緇熺駭鍘熺敓紿楀彛鍐呮牳瀵硅薄涔嬮棿鐨勫叧鑱旓紱
鍥犱負(fù)榪欎釜mapping鏄互綰跨▼涓哄崟浣嶆潵緇存姢鐨勶紝姣忎釜綰跨▼闂翠簰涓嶅叧鑱旓紝鎵浠ワ紝涓涓簲鐢ㄩ噷瀵逛簬娑夊強(qiáng)UI紿楀彛鐨?/p>
浠誨姟鏈濂芥槸閮芥斁鍦ㄥ悓涓涓嚎紼嬮噷闈紝涓鑸氨鏄綋鍓嶈繘紼嬬殑涓葷嚎紼嬶紝鍚﹀垯鍙兘鍑虹幇MFC object鍜孒WND涔嬮棿
鍏寵仈涓嶄笂鐨勯棶棰橈紝鑰屼笖榪欐牱鐨勯棶棰樿繕寰堥殣钄姐?br>
鑷充簬WNDCLASS緇撴瀯鑷甫鐨別xtra bytes鍩燂紝鏄互鍓嶇己涔忓簲鐢ㄦ鏋剁殑鏃朵唬錛屼嬌鐢╓in32 API鐩存帴寮鍙戞椂錛岃姣忎釜
紿楀彛綾伙紙榪欓噷鐨勭被錛屼笉鏄疌++ class鐨勬蹇碉紝鑰屾槸Windows緋葷粺紿楀彛瀹氫箟鏃剁殑涓縐嶆暟鎹粨鏋勶級(jí)閮借兘鏈変釜闄?/p>
甯︿竴浜涢澶栫殑鑷畾涔夋暟鎹殑絀洪棿錛岃繖涓┖闂村線寰琚敤鏉ュ瓨鏀句笌褰撳墠紿楀彛綾葷浉鍏崇殑鐢ㄦ埛鏁版嵁錛岄氬父鏄寚鍚?/p>
鏌愪釜鍐呭瓨鍖哄煙鐨勬寚閽堬紝褰撶▼搴忔搷浣滆繖涓睘浜庤繖涓獥鍙g被鐨勭獥鍙f椂灝卞彲浠ユ牴鎹繖涓檮甯︾殑鑷畾涔夋暟鎹紙鎴?/p>
鑰呮寚閽堬級(jí)鏉ユ搷浣滃搴旂殑鍏寵仈鑷畾涔夋暟鎹紱寰堝鍚庢潵鍑虹幇鐨勬鏋訛紝涔熼兘浣跨敤浜?jiǎn)杩欎釜extra bytes鍩燂紝鏉ュ瓨鏀?/p>
妗嗘灦鏈韓鐨勪竴浜涘拰紿楀彛綾葷浉鍏寵仈鐨勬暟鎹粨鏋勩備粠鐩墠瓚嬪娍鐪嬶紝鐩存帴浣跨敤WNDCLASS浠ュ強(qiáng)extra bytes鐨勫彲鑳?/p>
鎬ф槸寰箮鍏跺井浜?jiǎn)锛屼絾鏄鏋滆鍋氬ソ鍘熺敓搴旂敤鐨勫紑鍙戯紝寰堝搴曞眰鐨勫疄鐜扮粏鑺傛渶瑕佽繕鏄鐭ラ亾涓涓嬶紝浠ヤ究浜?/p>
浼樺寲緇撴瀯鍜屾ц兘錛屼互鍙?qiáng)鍑洪敊鏃剁殑璋冭瘯澶勭悊锛涘洜湄?fù)鏃犺鏄疻inform/WPF錛岃繕鏄法騫沖彴鐨刉TL/QT/WxWindows絳?/p>
絳夋柊鍨嬬殑鏈哄埗鎴栬呮鏋躲佺被搴擄紝鍙鏄湪Windows騫沖彴涓婃惌寤虹殑錛岄偅閮芥槸鍩轟簬鍓嶉潰璇磋繃鐨勮繖濂楁渶鍩烘湰涔熸槸
鏈鏍稿績(jī)鐨刉in32 API鍩虹涔嬩笂銆?/p>
In the fusion, or any other components or modules, how to retrieve the execution engine instance and how to generate such engine?
UtilExecutionEngine, implemented as COM object, support Queryinterface/AddRef/Release, and exposed via interface IExecutionEngine.
With SELF_NO_HOST defined,
BYTE g_ExecutionEngineInstance[sizeof(UtilExecutionEngine)];
g_ExecutionEngineInstance would be the singleton instance of current execution engine,
otherwise, without SELF_NO_HOST, the 'sscoree' dll would be loaded and try to get the exported function, which is named 'IEE' from such dll. Here, it is the well-known shim, in .net CLR, such module is named 'mscoree'. Further, if 'IEE' could not be found in such dll, system would try to locate another exported function, named 'LoadLibraryShim', and use such function to load the 'mscorwks' module, and try to locate the 'IEE' exportd functionin it.
It's very obvious that Rotor has implemented its own execution engine, but it also gives or make space for implementation of execution engine from 3rd party. Here, .net CLR is a good candidate definitely, Rotor might load the mscorwks.dll module for its usage.
PAL, PALAPI, for example, HeapAlloc, one famous WIN32 API, has been implemented as one PALAPI (defined in Heap.c), to make it possible that the CLI/Rotor be ported smoothly to other OS, such freebsd/mac os.
CRT routines are also reimplemented, such as memcpy, it has been implemented as GCSafeMemCpy
There're many macros in fuctions, such as SCAN_IGNORE_FAULT/STATIC_CONTRACT_NOTHROW/STATIC_CONTRACT_NOTRIGGER, they are for static analysis tool to scan, analyse and figour out the potential issues in code.
From view point of the execution model by CLI, the act of compiling (including JIT) high-level type descriptions would be separated from the act of turning these type descriptions into processor-specific code and memory structures.
And such executino model, in other word, the well-known 'managed execution', would defer the loading, verification and compilation of components until runtime really needs; At the same time, the type-loading is the key trigger that causes CLI's tool chain to be engaged at runtime. Deferred compilation(lead to JIT)/linking/loading would get better portability to different target platform and be ready for version change; The whole deferred process would driven by well-defined metadata and policy, and it would be very robust for building a virtual execution environment;
At the top of such CLI tool chain, fusion is reponsible for not only finding and binding related assemblies, which are via assembly reference defined in assembly, fusion also takes another important role, loader, and its part of functionality is implemented in PEAssembly, ClassLoader classes. For example, ClassLoader::LoadTypeHandleForTypeKey.
For types in virtual execution environment of CLI, rotor defines four kinds of elements for internal conducting,
ELEMENT_TYPE_CLASS for ordinary classes and generic instantiations(including value types);
ELEMENT_TYPE_ARRAY AND ELEMENT_TYPE_SZARRAY for array types
ELEMENT_TYPE_PRT and ELEMENT_TYPE_BYREF for pointer types
ELEMENT_TYPE_FNPTR for function pointer types
every type would be assigned unique ulong-typed token, and such token would be used to look up in m_TypeDefToMethodTableMap (Linear mapping from TypeDef token to MethodTable *)which is maintained by current module; If there it is, the pointer to method table of such type would be retrieved, or it would look up in the loader module, where the method table should exist in while it's JIT loaded, not launched from NGEN image;
And all the unresolved typed would be maintained in a hash table, PendingTypeLoadTable; Types and only those types that are needed, such as dependencies, including parent types, are loaded in runtime, such type is fully loaded and ready for further execution, and other unresolved types would be kept in the previous hash table.
2) 鍐嶄粠澶у鏁板簲鐢ㄤ腑甯歌鐨勭被緇ф壙浣撶郴涓婄湅錛?br>闄や簡(jiǎn)鏁翠釜緇ф壙浣撶郴鎵緇熶竴寮鏀懼嚭鏉ョ殑鎺ュ彛闆嗭紙涔熷氨鏄敱铏氬嚱鏁版墍緇勬垚錛夛紝鍦ㄧ戶鎵夸綋緋葷殑姣忎釜灞傞潰鍙﹀浼?xì)鏈夊ぇ閲忕殑鍏朵粬杈呭姪鎴愬憳鍑芥晭图堝叾鏁伴噺閫氬父姣旇櫄鍑芥暟澶氱殑澶氾級(jí)錛岃繖浜涙垚鍛樺嚱鏁板畬鍏ㄦ病蹇呰璁捐鎴愯櫄鍑芥暟錛?/p>
3) 浠庡叾浠栬璦鐪嬶紝
鍗充嬌杈冩柊鐨勮櫄鎷熸満璇█C#(Java綆楁槸杈冭佺殑铏氭嫙鏈鴻璦),鍙嶈屽畾涔変簡(jiǎn)姣擟++鏇翠負(fù)涓ユ牸鏇翠負(fù)鏄懼紡鐨勬垚鍛樻柟娉曞疄鐜版垨瑕嗙洊鎴栭噸杞芥垨鏂板緩鐨勮鍒欙紱榪欐槸闈炲父閲嶈鐨勫C++浠ュ強(qiáng)Java璁捐鎬濇兂鐨勫弽鎬濄?/p>
4) 浠庤璦鐨勯傜敤鍦哄悎鐪嬶紝
鎴戜滑鐜板湪鐨勮璁猴紝緇濆ぇ澶氭暟鎯呭喌涓嬪甫鏈変竴涓潪甯擱噸瑕佺殑榛樿鍓嶆彁錛岄偅灝辨槸鍦ㄧ敤鎴鋒佹ā寮忎笅浣跨敤C++錛屽鏋滄斁瀹借繖涓害鏉燂紝鍦ㄥ唴鏍告ā寮忎笅浣跨敤C++錛岄偅鎯呭喌鍙堝畬鍏ㄤ笉鍚屼簡(jiǎn)銆?br>寮曠敤涓嬮潰榪欎釜鏂囨。鐨勮鐐癸紝http://www.microsoft.com/china/whdc/driver/kernel/KMcode.mspx
棣栧厛錛岀敤鎴鋒佷笅闈炲父寤変環(huán)鍑犱箮涓嶇敤鑰冭檻鐨勮祫婧愶紝鍦ㄥ唴鏍鎬腑鏄潪甯告槀璐電殑錛屾瘮濡傚唴鏍稿爢鏍堜竴鑸氨3涓猵age錛?/p>
鍦ㄥ唴鏍鎬笉鑳藉垎欏?paging)鏃跺繀欏諱繚璇佸皢琚墽琛岀殑鎵鏈変唬鐮佸拰鏁版嵁蹇呴』鏈夋晥鐨勯┗鐣欏湪鐗╃悊鍐呭瓨涓紝濡傛灉榪欐椂闇瑕佸椹葷暀鍑犲紶铏氳〃浠ュ強(qiáng)铏氳〃鎸囬拡閭h繕鏄樉寰楅潪甯告槀璐電殑錛屽悓鏃剁紪璇戝櫒涓鴻櫄鍑芥暟錛屾ā鏉跨瓑鐢熸垚浠g爜鐨勬柟寮忥紝璁╁紑鍙戜漢鍛樺緢闅劇‘瀹氳鎵ц涓涓嚱鏁版墍闇瑕佺殑鎵鏈変唬鐮佺殑鎵鍦ㄤ綅緗紝鍥犳涔熸棤娉曠洿鎺ユ帶鍒剁敤浜庡畨緗繖浜涗唬鐮佺殑鑺傦紙涓漢璁や負(fù)鍙兘閫氳繃progma segment/datasegment/codesegment瀵逛簬浠g爜鍜屾暟鎹繘琛岄泦涓帶鍒訛級(jí)錛屽洜姝ゅ湪闇瑕佽繖浜涗唬鐮佹椂錛屽彲鑳藉凡緇忚page out浜?jiǎn)锛?/p>
鎵鏈夋秹鍙?qiáng)绫诲眰娆【l撴瀯錛屾ā鏉匡紝寮傚父絳夌瓑榪欐牱鐨勪竴浜涜璦緇撴瀯鍦ㄥ唴鏍告佷腑閮藉彲鑳芥槸涓嶅畨鍏ㄧ殑錛屾渶濂芥槸鎶婄被鐨勪嬌鐢ㄩ檺瀹氫負(fù)POD綾伙紝鍥炲埌鎴戜滑鐨勪富棰樿櫄鍑芥暟錛屼篃灝辨槸璇村唴鏍告佷笅綾昏璁′腑娌℃湁铏氬嚱鏁般?/p>
榪欎釜鏃笉鏄簲鐢ㄦ湰韜殑bug錛屼篃涓嶆槸緋葷粺鐨刴emory leak銆?/p>
褰撳墠璧勬簮鐩戣鍣ㄤ腑鍏充簬緋葷粺鐗╃悊鍐呭瓨錛屾湁榪欎箞鍑犱釜緇熻欏癸紝鍙敤銆佺紦瀛樸佹繪暟銆佸凡瀹夎錛涘叾涓?緙撳瓨"榪欓」錛屼唬琛ㄧ潃宸茬敤浜庢枃浠剁郴緇熴佺綉緇滅瓑絳夊瓙緋葷粺鐨勬暟鎹紦鍐插瓨鍌ㄧ殑鍐呭瓨瀹歸噺錛屽叾涓寘鍚暟閲忓法澶х殑椹葷暀鍦ㄧ墿鐞嗗唴瀛樹腑鐨勬暟鎹〉闈€傝岃繖鏍風(fēng)殑鐗╃悊鍐呭瓨娑堣楀茍娌℃湁褰掑叆浠諱綍涓涓繘紼嬪垪琛ㄦ樉紺虹殑榪涚▼鎵鍗犵敤鐨勭墿鐞嗗唴瀛樸傝繖灝辨槸涓轟粈涔堜笅闈㈠叕寮忥紝
榪涚▼鍒楄〃鏄劇ず鐨勬墍鏈夎繘紼嬫墍鍗犵敤鐨勭墿鐞嗗唴瀛樹箣鍜?+ 鍙敤鐗╃悊鍐呭瓨 < 鐗╃悊鍐呭瓨鎬繪暟
錛屾垚绔嬬殑鍘熷洜鎵鍦ㄣ?/p>
瀵艱嚧榪欎竴鐜拌薄鐨勫師鍥狅紝浠庤繖涓ぇ瑙勬ā璁$畻紼嬪簭鐨勮涓烘弿榪扮湅錛屽熀鏈彲浠ユ柇瀹氭槸鐢變簬浠ヤ笅涓ょ偣錛?br>1錛夊簲鐢ㄦ湰韜殑澶ц妯℃暟鎹┗鐣欑墿鐞嗗唴瀛橈紝瀵艱嚧parser.exe榪涚▼搴炲ぇ鐨剋orking set錛?br>2錛夊ぇ閲忛綣佺殑IO鎿嶄綔錛屽紩璧峰ぇ閲忕殑鐗╃悊鍐呭瓨涓虹郴緇熺紦瀛樻墍鍗犵敤錛?/p>
瀵逛簬1),蹇呴』娉ㄦ剰錛孏C.Collect()鍙槸璁劇疆浣胯兘鍨冨溇鏀墮泦鐨勬爣蹇椾綅錛屽茍娌℃湁绔嬪嵆鍚姩鍨冨溇鏀墮泦榪囩▼錛岃繖涓繃紼嬬殑瀹為檯鍚姩鏃跺埢鐢盋LR鏉ュ姩鎬佸喅璁紱
鎵浠ュ鏋滆鑾峰緱鍗蟲椂鐨勬墭綆″唴瀛樼殑閲婃斁錛屽茍榪涗竴姝ラ噴鏀劇墿鐞嗗唴瀛樹互鍑忓皬褰撳墠榪涚▼鐨剋orking set錛屽彲浠ヤ嬌鐢ˋppDomain榪欎釜.net涓嬪彲浠ョ敤鏉ヨ祫婧愬垝鍒嗐佽幏鍙栧拰閲婃斁鐨勶紝鍦ㄦ蹇典笂榪戜技浜庤交閲忕駭榪涚▼鐨勭紪紼嬭涔夛紱鍦ˋppDomain涓幏鍙栫殑鍚勭璧勬簮錛屽寘鎷墭綆″唴瀛樸佸姞杞藉叾涓殑鍚勪釜assembly浠ュ強(qiáng)CCW絳夛紝鍦ㄦAppDomain琚噴鏀炬椂閮借鐩稿簲鐨勫強(qiáng)鏃墮噴鏀撅紙鎴栬呭紩鐢ㄨ鏁伴掑噺錛夈?/p>
瀵逛簬2錛夛紝閲嶆柊瑙傚療鍏堝墠鐨勮璁″疄鐜板拰妯″瀷錛岃冭檻鏄惁鑳芥妸涓浜涘垎鏁g殑IO鎿嶄綔鍚堝茍璧鋒潵榪涜錛屾瘮濡?
for(long i=0; i < Count; ++i)
{
...
objIO.Operation(Data[i], 1);
...
}
淇敼涓?br>for(long i=0; i < Count; ++i)
{
...
...
}
objIO.Operation(Data, Count);
榪欐牱瀵逛簬鎻愰珮搴旂敤鐨処O鏁堢巼浠ュ強(qiáng)鎻愬崌緋葷粺緙撳瓨鍒╃敤鐜囧簲褰撲細(xì)鏈夊府鍔┿?/p>
瀵逛簬2錛夛紝緋葷粺緙撳瓨闅忕潃榪欎釜澶ц妯¤綆楀簲鐢ㄧ殑榪涜鑰岄愭澧炲ぇ錛屽茍鏈鍚庡鑷存暣涓郴緇熸棤娉曡幏鍙栫殑鐗╃悊鍐呭瓨鑰屾棤娉曠戶緇繍琛岀殑鐜拌薄錛屼及璁″嵆浣塊噰鐢ㄤ簡(jiǎn)鍦ㄤ笂鏂囨彁鍑虹殑錛屽湪搴旂敤紼嬪簭浠g爜涓敖鍙兘鍚堝茍IO鎿嶄綔錛屽噺灝慖O嬈℃暟鐨勬柟娉曪紝涔熶笉浼?xì)鏀瑰杽绯痪l熺紦瀛樺崰鐢ㄧ墿鐞嗗唴瀛樻暟閲忚繃澶х殑闂銆傝繖涓棶棰樻湰璐ㄤ笂鏄疻indows鎿嶄綔緋葷粺鏈韓浠嶯T鏃朵唬鍒扮幇鍦紝涓鐩村瓨鍦ㄧ殑闂錛屼富瑕佹槸鍥寸粫鐫Windows kernel涓殑Cache mananger浠ュ強(qiáng)memory manager鏍稿績(jī)鎬佺粍浠剁殑瀹炵幇鏈哄埗鑰屼駭鐢熺殑銆?/p>
鏍規(guī)嵁鐩墠鐨凜c(瀵笴ache manager鐨勭畝縐幫紝鍦╓indowsResourceKernel寮婧愰」鐩腑錛孋ache manager鐩稿叧妯″潡鐨勫嚱鏁伴兘浠c浣滀負(fù)鍓嶇紑錛屾瘮濡侰cCopyRead錛孋cFlushCache絳夛紝Memory manager涔熷悓鏍風(fēng)畝縐癕m)鐨勫疄鐜版満鍒訛紝鎵鏈夊鏂囦歡緋葷粺鐨勮闂紝鍖呮嫭鏈湴鍜岀綉緇滐紝閮戒細(xì)棣栧厛鐢盋c瀵圭浉鍏抽〉闈綔緙撳瓨鏄犲皠錛岄殢鐫棰戠箒鐨処O鐨勬搷浣滐紝琚獵c緙撳瓨鐨勯〉闈篃榪呴熼掑錛岃岃緙撳瓨欏甸潰鍗犵敤澶氬皯鐗╃悊鍐呭瓨錛岃繖鏄敱Windows kernel涓殑Memory manager鍐沖畾銆傜洰鍓嶅湪64浣嶅鉤鍙頒笂錛岀郴緇熺紦瀛樻渶楂樺彲杈?TB錛屾墍浠ヨ繖涓簲鐢ㄨ繘紼嬬殑榪愯涓嚭鐜板垎閰?G鐨勭紦瀛樻槸瀹屽叏鍙兘鐨勶紝浣嗗悓鏃墮棶棰樹篃闅忎箣鑰屾潵錛岄偅灝辨槸緋葷粺緙撳瓨鍗犵敤浜?jiǎn)杩囧鐨勭墿鐞嗗唴瀛樺Q屽鑷村叾浠栬繘紼嬩互鍙?qiáng)鍐呮牳鏈w棤娉曠敵璇瘋凍澶熺殑鐗╃悊鍐呭瓨錛屾渶鍚庤嚧浣跨郴緇?#8220;鍍墊”錛?/p>
瀵逛簬榪欎釜闂錛屽井杞彁渚涗簡(jiǎn)“Microsoft Windows Dynamic Cache Service”宸ュ叿鏉ユ彁渚涘緋葷粺緙撳瓨鐨勫伐浣滈泦working set瀹歸噺錛堜篃灝辨槸椹葷暀鐗╃悊鍐呭瓨鐨勫ぇ灝忥級(jí)鐨勬帶鍒訛紝榪欎釜宸ュ叿涓昏鏄SetSystemFileCacheSize鐨勫皝瑁咃紝鍙互璁劇疆緋葷粺緙撳瓨瀹歸噺鐨勪笂涓嬮檺銆?/p>
浣嗚繖鍙槸涓縐嶄復(fù)鏃剁殑瑙e喅鏂規(guī)錛屽洜涓哄簲鐢ㄨ櫧鐒跺彲浠ラ氳繃涓婇潰榪欎釜Dynamic Cache Service鏉ヨ緗拰闄愬埗緋葷粺緙撳瓨瀹歸噺鐨勫ぇ灝忥紝浣嗘槸濡備綍紜畾緙撳瓨瀹歸噺澶у皬鐨勯潪甯稿洶闅撅紝濡傛灉榪囧皬錛屾墍鏈塈O鎬ц兘澶у彈褰卞搷錛屾暣涓狢c濡傚悓铏氳錛涘鏋滆繃澶?絳変環(huán)浜庝笉鍙楅檺)錛岄偅涔堢郴緇熺紦瀛樺崰鐢ㄨ繃澶氱墿鐞嗗唴瀛樺鑷寸郴緇熷兊姝葷殑鐜拌薄灝變細(xì)閲嶇幇銆?/p>
鎵浠ヤ粠鏍規(guī)湰涓婄湅錛岃繖涓棶棰樺簲鐢卞寘鎷珻c鍜孧m鍦ㄥ唴鐨勬暣涓猈indows kernel浣滃嚭瀹屾暣涓鑷寸殑璋冩暣錛屼絾浠庣洰鍓嶇殑瀹炵幇鐪嬭瀹屾垚鏁翠釜鏂規(guī)鏀瑰姩寰堝ぇ錛屾嵁縐拌繖涓敼榪涘彲鑳戒細(xì)鑰冭檻鍖呭惈鍦╓in7涓彂甯冦?/p>
Microsoft Windows Dynamic Cache Service涓嬭澆,
http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e24ade0a-5efe-43c8-b9c3-5d0ecb2f39af&displaylang=en
Microsoft Windows Dynamic Cache Service鐩稿叧鐨勪粙緇嶏紝
http://blogs.msdn.com/b/ntdebugging/archive/2009/02/06/microsoft-windows-dynamic-cache-service.aspx
棣栧厛錛屽唴鏍稿璞″彧鑳界敱鍦ㄥ唴鏍告佷笅鐨勪緥紼嬫墠鑳界洿鎺ヨ闂紝鍦ㄦ垜浠棩甯哥殑浠g爜涓紝鎵璋冪敤鐨刉indows API錛屾瘮濡侰reateFile, 錛堟敞鎰忚皟鐢ㄥ垰寮濮嬫椂鏄浜庣敤鎴鋒佷笅鐨勶級(jí)錛屼竴鑸兘浼?xì)鍦╪tdll.dll涓壘鍒板搴旂殑鍐呮牳鍑芥暟鎴栦緥紼嬶紝鎺ョ潃緋葷粺鍒囨崲鍒板唴鏍告侊紝寮濮嬭皟鐢ㄥ疄闄呭搴旂殑鍐呮牳鍑芥暟(KiCreateFile)錛岃繖涓椂鍊欐墠浼?xì)鍘昏畨K棶鍐呮牳瀵硅薄鐨勫疄闄呭湴鍧錛岀劧鍚庡緩绔嬩竴涓鍐呮牳瀵硅薄瀵瑰簲褰撳墠榪涚▼鐨凥andle錛屽茍鎶婂畠榪斿洖緇檆aller錛屽悓鏃跺垏鎹㈠洖鐢ㄦ埛鎬侊紱鍥犳錛屽浜庣敤鎴鋒佺▼搴忔潵璇達(dá)紝鍙涓斿彧鑳界煡閬撹鍐呮牳瀵硅薄鍦ㄥ綋鍓嶈繘紼嬩腑鐨勫搴旂殑Handle灝卞彲浠ュ鍏惰繘琛屾搷浣滀簡(jiǎn)錛?/p>
鍏舵錛岃繖鏍風(fēng)殑璁捐鏄嚭浜庡OS鏍稿績(jī)鏁版嵁緇撴瀯錛堝綋鐒跺寘鎷垜浠鍦ㄨ璁虹殑鍐呮牳瀵硅薄錛夌殑淇濇姢錛涘鏋滅敤鎴鋒佺▼搴忓彲浠ヨ交鏄撶殑鑾峰彇鍐呮牳鏁版嵁緇撴瀯鐨勫疄闄呭湴鍧錛岄偅涔堝浜庢暣涓狾S鐨勫畨鍏ㄥ拰紼沖畾鏄劇劧鏋勬垚寰堝ぇ鐨勯棶棰橈紱涓涓敤鎴鋒佺殑璇搷浣滃彲浠ヨ交鏄撶殑寮曡搗鏁翠釜OS鐨勫穿婧冿紝鑰屾湁浜?jiǎn)杩欎竴灞傜殑淇濇姢錛屽穿婧冪殑鍙槸褰撳墠榪涚▼鑰屼笉鏄暣涓郴緇燂紱
鎺ョ潃涓婇潰榪欑偣錛屼篃鍙互鐪嬪嚭錛屽唴鏍稿璞$殑濡傛璁捐杈懼埌浜?jiǎn)鎺ゾU砄S鏈韓鐨勫鉤婊戞紨榪涚殑鐩殑銆備粠Windows 3.0鍒?5/98錛屼粠NT鍒癢in2k/XP錛屽啀鍒扮溂涓嬬殑Vista/Win7錛學(xué)indows鎿嶄綔緋葷粺鏈韓鍙戠敓浜?jiǎn)宸ㄥぇ鐨勫彉鍖栧拰杩涙锛岄噰绾充簡(jiǎn)鏃犳暟鐨勬柊鎶鏈柊鏂規(guī)硶錛屼絾鏄畠鍩烘湰鐨勭郴緇熷簲鐢ㄧ紪紼嬫帴鍙o紝涔熷氨鏄垜浠墍鐔熺煡鐨剋indows API錛屽嵈騫舵病鏈夊彂鐢熷お澶х殑鏀瑰彉錛屽緢澶歐in 3.0 榪欎釜16浣峅S鏃朵唬鐨勭▼搴忎唬鐮佸彧瑕佸綋鍒濊璁¤鑼冪紪鐮佽鑼冿紝紼嶈淇敼灝卞彲浠ュ湪鏈鏂扮増鐨凮S涓婅繍琛屽椋烇紱鏄粈涔堝仛鍒頒簡(jiǎn)榪欎簺錛熶篃灝辨槸鎵璋撶殑鏋佷負(fù)閲嶈鐨勫悜鍚庡吋瀹規(guī)э紝鎴戜釜浜鴻涓猴紝鎶婃搷浣滅郴緇熺殑閲嶈/涓昏鍔熻兘鎶借薄鎴愬唴鏍稿璞★紝騫墮氳繃涓濂楁瀬涓簊olid鐨凙PI鏆撮湶鍑烘潵錛岃揪鎴愪簡(jiǎn)榪欎釜鐩爣銆?/p>
榪欐槸涓縐嶆洿楂樺眰嬈′笂鐨勯潰鍚戝璞★紝鎶婂疄鐜扮殑緇嗚妭錛屾妸緋葷粺鐨勫鏉傦紝綆鍗曡屼紭闆呯殑灝佽浜?jiǎn)钃v鏉ャ備綘鍙璋冪敤CreateFile鍘誨緩涓枃浠舵垨綆¢亾鎴栭偖妲斤紝涓嶇敤鎷呭績(jī)褰撳墠OS鏄疻indows 3.0榪樻槸Win7錛岃幏寰楃殑Handle錛屼綘涔熶笉鐢ㄥ幓鍏沖績(jī)瀹冧互鍙?qiáng)瀹冩墍鎸囧悜鐨勫唴鏍稿璞℃槸Windows 3.0鐨勫疄鐜拌繕鏄疻in7鐨勫疄鐜般?/p>
Windows涓婃墍鏈夌殑綺懼僵鍑犱箮閮芥槸鍩轟簬榪欏閫氳繃鍐呮牳瀵硅薄姒傚康鎶借薄騫舵毚闇茬殑API鍩虹涔嬩笂錛孋OM/OLE錛岃繖涓簩鍗佸勾鍓嶉渿鎾兼х殑ABI鍜孖PC鑼冪暣鐨勬妧鏈鑼冿紝鍏朵腑寰堝鐨勮璁℃濊礬涔熸槸妞嶆牴浜庡唴鏍稿璞$殑璁捐鐞嗗康錛屽COM瀵硅薄鐨勫紩鐢ㄨ鏁板拰鍐呮牳瀵硅薄寮曠敤璁℃暟錛孖Unknown鍜學(xué)indows Handle(鍓嶈呮槸鎸囧悜鏌愪釜浜岃繘鍒跺吋瀹圭殑緇勪歡瀵硅薄錛屽悗鑰呭紩鐢ㄦ垨闂存帴鎸囧悜鏌愪釜鍐呮牳瀵硅薄錛岄兘鏄浜庢煇涓鏉傛蹇電殑涓鑷存ф娊璞¤〃榪?錛岀瓑絳夛紱
鍗佸勾鍓嶇殑.net錛屾湰鏉ユ槸浣滀負(fù)COM鐨勫崌綰х増鏈帹鍑猴紝鎶奀OM/OLE鐨勫疄鐜板鏉傛у皝瑁呭湪浜?jiǎn)铏氭嫙鏈候q沖彴CLR閲岄潰錛岃屼粠榪欎釜铏氭嫙鏈虹殑寮婧愬疄鐜癝SCLI錛屾垜浠彲浠ョ湅鍒板ぇ閲忕殑COM鏈哄埗鍦?net鐨勫叿浣撳疄鐜伴噷闈㈣搗浜?jiǎn)鋴D瓚寵交閲嶇殑浣滅敤銆傚湪榪欎簺VM涓ぇ閲弒ymbol鏈夌潃COR鐨勫墠緙鎴栬呭悗緙錛孋OR鎸囦唬浠涔堬紵Common Object Runtime, 鍘熸潵CLR/SSCLI鐨勮璁℃濊礬涔熸槸鎶奜S閫氳繃铏氭嫙鏈篤M鐨勫艦寮忥紝騫墮氳繃common object鍚戝簲鐢ㄧ▼搴忔毚闇插姛鑳姐?/p>
灝忕粨涓涓嬶紝
OS鍐呮牳瀵硅薄API錛屼笁鍗佸勾鍓嶇郴緇熺駭鍒殑瀵硅薄鎶借薄錛?br>COM/OLE錛屼簩鍗佸勾鍓嶄簩榪涘埗緇勪歡綰у埆鐨勫璞℃娊璞★紱
.net/CLR, 鍗佸勾鍓嶈櫄鎷熸満騫沖彴綰у埆鐨勫璞℃娊璞★紱
鍐欏埌榪欓噷鍊掓槸寮曡搗浜?jiǎn)鎴戝叾浠栫殑涓浜涙濊冿紝杞歡宸ヤ笟鐣屼竴鐩翠互鏉ュ闈㈠悜瀵硅薄OO鏄儹鐏湞澶╋紝鐗瑰埆鏄璦灞傞潰錛屼粠C++/Java/C#鍒癙ython/JScript錛屼笉涓鑰岃凍錛?/p>
浣嗘槸鎴戜滑鏈夋病鏈変粠鏍規(guī)湰鎬х殑璁捐鐞嗗康涓婂闈㈠悜瀵硅薄錛屽療綰抽泤璦浜?jiǎn)鍛㈠Q?/p>
濡傛灉鐜板湪璁捐Windows榪欏API鐨勪換鍔℃斁鍦ㄥぇ瀹墮潰鍓嶏紝浼?xì)閲囩敤鍐呮牳瀵硅?Handle鏂規(guī)榪樻槸鐩存帴鎸囧悜OS鍐呴儴鏁版嵁緇撴瀯鐨勬柟寮忔潵鏆撮湶鍔熻兘錛?/p>
浠庝笁鍗佸勾鍓嶇殑榪欏API鐨勮璁′腑錛屾垜浠湡鐨勫彲浠ュ鍒板緢澶氥?/p>